====== Language plugins : Implementation ======
===== parse_top_item =====
The function ''parse_top_item'' must be provided. Usually you can just copy this.
/*--------------------------------------------------------------------------*/
void LANG_VERILOG::parse_top_item(CS& cmd, CARD_LIST* Scope)
{
cmd.get_line("gnucap-verilog>");
new__instance(cmd, NULL, Scope);
}
/*--------------------------------------------------------------------------*/
It parses one line of input, where the definition of "line" may differ depending on the language.
The string, in this case ''"gnucap-verilog>"'' is used as a prompt in interactive mode, and is suppressed when reading from a file.
For educational purposes, the code for ''new_''''_instance'' follows. You do not need to duplicate it.
You do need to provide ''find_type_in_string'', which returns the type as a string, by scanning the input.
''parse_item'' is shown here. It dispatches to one of ''parse_module'', ''parse_instance'', ''parse_paramset'', ''parse_comment'', or ''parse_command'', which you must provide.
/*--------------------------------------------------------------------------*/
void LANGUAGE::new__instance(CS& cmd, MODEL_SUBCKT* owner, CARD_LIST* Scope)
{
if (cmd.is_end()) {
// nothing
}else{
std::string type = find_type_in_string(cmd);
if (const CARD* proto = find_proto(type, owner)) {
CARD* new_instance = proto->clone_instance();
assert(new_instance);
new_instance->set_owner(owner);
CARD* x = parse_item(cmd, new_instance);
if (x) {
assert(Scope);
Scope->push_back(x);
}else{
}
}else{
cmd.warn(bDANGER, type + ": no match");
}
}
}
/*--------------------------------------------------------------------------*/
CARD* LANGUAGE::parse_item(CS& cmd, CARD* c)
{
// See Stroustrup 15.4.5
// If you can think of a better way, tell me.
// It must be in the LANGUAGE class, not CARD.
if (dynamic_cast(c)) {
return parse_module(cmd, prechecked_cast(c));
}else if (dynamic_cast(c)) {
return parse_instance(cmd, prechecked_cast(c));
}else if (dynamic_cast(c)) {
return parse_paramset(cmd, prechecked_cast(c));
}else if (dynamic_cast< DEV_COMMENT*>(c)) {
return parse_comment(cmd, prechecked_cast(c));
}else if (dynamic_cast(c)) {
return parse_command(cmd, prechecked_cast(c));
}else{untested();
incomplete();
unreachable();
return NULL;
}
}
/*--------------------------------------------------------------------------*/