summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_parser.cpp')
-rw-r--r--src/lib/netlist/nl_parser.cpp93
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()));
+ }
}
}