diff options
Diffstat (limited to 'src/lib/netlist/nl_parser.cpp')
-rw-r--r-- | src/lib/netlist/nl_parser.cpp | 93 |
1 files changed, 60 insertions, 33 deletions
diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index e23e5f9f89b..791ac073dd1 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -3,6 +3,7 @@ #include "nl_parser.h" #include "nl_base.h" +#include "nl_setup.h" #include "nl_errstr.h" #include "nl_factory.h" @@ -18,43 +19,64 @@ void parser_t::verror(const pstring &msg) throw nl_exception(plib::pfmt("{1}")(msg)); } -bool parser_t::parse(const pstring &nlname) +parser_t::parser_t(nlparse_t &setup) + : m_setup(setup) { - this->identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-$@") + m_tokenizer.identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-$@") .number_chars(".0123456789", "0123456789eE-.") //FIXME: processing of numbers .whitespace(pstring("") + ' ' + static_cast<char>(9) + static_cast<char>(10) + static_cast<char>(13)) .comment("/*", "*/", "//"); - m_tok_paren_left = register_token("("); - m_tok_paren_right = register_token(")"); - m_tok_comma = register_token(","); - - m_tok_ALIAS = register_token("ALIAS"); - m_tok_DIPPINS = register_token("DIPPINS"); - m_tok_NET_C = register_token("NET_C"); - m_tok_FRONTIER = register_token("OPTIMIZE_FRONTIER"); - m_tok_PARAM = register_token("PARAM"); - m_tok_DEFPARAM = register_token("DEFPARAM"); - m_tok_HINT = register_token("HINT"); - m_tok_NET_MODEL = register_token("NET_MODEL"); - m_tok_NET_REGISTER_DEV = register_token("NET_REGISTER_DEV"); - m_tok_INCLUDE = register_token("INCLUDE"); - m_tok_LOCAL_SOURCE = register_token("LOCAL_SOURCE"); - m_tok_LOCAL_LIB_ENTRY = register_token("LOCAL_LIB_ENTRY"); - m_tok_SUBMODEL = register_token("SUBMODEL"); - m_tok_NETLIST_START = register_token("NETLIST_START"); - m_tok_NETLIST_END = register_token("NETLIST_END"); - m_tok_TRUTHTABLE_START = register_token("TRUTHTABLE_START"); - m_tok_TRUTHTABLE_END = register_token("TRUTHTABLE_END"); - m_tok_TT_HEAD = register_token("TT_HEAD"); - m_tok_TT_LINE = register_token("TT_LINE"); - m_tok_TT_FAMILY = register_token("TT_FAMILY"); - - register_token("RES_R"); - register_token("RES_K"); - register_token("RES_M"); - register_token("CAP_U"); - register_token("CAP_N"); - register_token("CAP_P"); + m_tok_paren_left = m_tokenizer.register_token("("); + m_tok_paren_right = m_tokenizer.register_token(")"); + m_tok_comma = m_tokenizer.register_token(","); + + m_tok_static = m_tokenizer.register_token("static"); + m_tok_ALIAS = m_tokenizer.register_token("ALIAS"); + m_tok_DIPPINS = m_tokenizer.register_token("DIPPINS"); + m_tok_NET_C = m_tokenizer.register_token("NET_C"); + m_tok_FRONTIER = m_tokenizer.register_token("OPTIMIZE_FRONTIER"); + m_tok_PARAM = m_tokenizer.register_token("PARAM"); + m_tok_DEFPARAM = m_tokenizer.register_token("DEFPARAM"); + m_tok_HINT = m_tokenizer.register_token("HINT"); + m_tok_NET_MODEL = m_tokenizer.register_token("NET_MODEL"); + m_tok_NET_REGISTER_DEV = m_tokenizer.register_token("NET_REGISTER_DEV"); + m_tok_INCLUDE = m_tokenizer.register_token("INCLUDE"); + m_tok_LOCAL_SOURCE = m_tokenizer.register_token("LOCAL_SOURCE"); + m_tok_LOCAL_LIB_ENTRY = m_tokenizer.register_token("LOCAL_LIB_ENTRY"); + m_tok_SUBMODEL = m_tokenizer.register_token("SUBMODEL"); + m_tok_NETLIST_START = m_tokenizer.register_token("NETLIST_START"); + m_tok_NETLIST_END = m_tokenizer.register_token("NETLIST_END"); + m_tok_TRUTHTABLE_START = m_tokenizer.register_token("TRUTHTABLE_START"); + m_tok_TRUTHTABLE_END = m_tokenizer.register_token("TRUTHTABLE_END"); + m_tok_TT_HEAD = m_tokenizer.register_token("TT_HEAD"); + m_tok_TT_LINE = m_tokenizer.register_token("TT_LINE"); + m_tok_TT_FAMILY = m_tokenizer.register_token("TT_FAMILY"); + + m_tokenizer.register_token("RES_R"); + m_tokenizer.register_token("RES_K"); + m_tokenizer.register_token("RES_M"); + m_tokenizer.register_token("CAP_U"); + m_tokenizer.register_token("CAP_N"); + m_tokenizer.register_token("CAP_P"); + +} + +bool parser_t::parse(plib::psource_t::stream_ptr &&strm, const pstring &nlname) +{ + token_store tokstor; + parse_tokens(std::move(strm), tokstor); + return parse(tokstor, nlname); +} + +void parser_t::parse_tokens(plib::psource_t::stream_ptr &&strm, token_store &tokstor) +{ + plib::putf8_reader u8reader(strm.release_stream()); + m_tokenizer.append_to_store(&u8reader, tokstor); +} + +bool parser_t::parse(token_store &tokstor, const pstring &nlname) +{ + set_token_source(&tokstor); bool in_nl = false; @@ -92,6 +114,11 @@ bool parser_t::parse(const pstring &nlname) in_nl = true; } + else if (!in_nl) + { + if (!token.is(m_tok_static)) + error(MF_EXPECTED_NETLIST_START_1(token.str())); + } } } |