#include "module.h" namespace COMPONENT{ void component_fsm_fail(){ std::cerr << "Component parsing failure" << std::endl; exit(EXIT_FAILURE); } void make_pins(std::vector * pins, std::vector & tokens, int *i){ //pins->reserve(1000); while(true){ if(!((tokens)[*i].getType() == Token::NAME)){ component_fsm_fail(); } Pin * pin = new Pin(); pin -> name = (tokens)[*i].getData(); pin -> bus_msb = -1; pin -> bus_lsb = -1; (*i)++; if(!((tokens)[*i].getType() == Token::SINGLE)){ component_fsm_fail(); } if(!(tokens)[*i].getData().compare(")")){ pins->push_back(*pin); (*i)+= 2; return; } if(!(tokens)[*i].getData().compare(",")){ pins->push_back(*pin); (*i)++; continue; } if((tokens)[*i].getData().compare("[")){ component_fsm_fail(); } (*i)++; if(!((tokens)[*i].getType() == Token::NUMBER)){ component_fsm_fail(); } pin->bus_msb = atoi((tokens)[*i].getData().c_str()); (*i)++; if(!((tokens)[*i].getType() == Token::SINGLE)){ component_fsm_fail(); } if(!(tokens)[*i].getData().compare("]")){ (*i)++; } else if(!(tokens)[*i].getData().compare(":")){ (*i)++; if(!((tokens)[*i].getType() == Token::NUMBER)){ component_fsm_fail(); } pin->bus_lsb = atoi((tokens)[*i].getData().c_str()); (*i)++; if(!(tokens)[*i].getData().compare("]")){ (*i)++; } else { component_fsm_fail(); } } if(!(tokens)[*i].getData().compare(")")){ pins->push_back(*pin); (*i)+= 2; return; } if(!(tokens)[*i].getData().compare(",")){ pins->push_back(*pin); (*i)++; continue; } component_fsm_fail(); } } void component_fsm_parser(Component * comp, Pin * pin, std::vector & tokens, int * i, component_fsm_states state){ //std::cout << "component token " << *i << " state "<< state << std::endl; if((tokens)[*i].getType() != Token::NAME){ component_fsm_fail(); } comp->type = (tokens)[*i].getData(); comp->name = ""; (*i)++; if((tokens)[*i].getType() == Token::NAME){ comp->name = (tokens)[*i].getData(); (*i)++; } if(!(tokens)[*i].getData().compare("(")){ (*i)++; } else { component_fsm_fail(); } make_pins(&(comp->pins), tokens, i); return; } }