#include "module.h" namespace WIRE{ void wire_fsm_fail(){ std::cerr << "Wire parsing failure" << std::endl; exit(EXIT_FAILURE); } void parse_wires(std::vector * wires, Wire * wire, int width, std::vector & tokens, int * i, wire_fsm_states state){ switch(state){ case INIT: if(!(tokens)[*i].getData().compare("wire")){ wire = new Wire(); wire-> width = 1; (*i)++; return parse_wires(wires, wire, 1, tokens, i, WIRE); } wire_fsm_fail(); case WIRE: if(!(tokens)[*i].getData().compare("[")){ (*i)++; return parse_wires(wires, wire, width, tokens, i, BUS); } if((tokens)[*i].getType() == Token::NAME){ wire->name = (tokens)[*i].getData(); wires->push_back(wire); (*i)++; return parse_wires(wires, NULL, width, tokens, i, WIRE_NAME); } wire_fsm_fail(); case BUS: if((tokens)[*i].getType() == Token::NUMBER){ wire->width = atoi((tokens)[*i].getData().c_str()) + 1; (*i)++; return parse_wires(wires, wire, wire->width, tokens, i, BUS_MSB); } case BUS_MSB: if(!(tokens)[*i].getData().compare(":")){ (*i)++; return parse_wires(wires, wire, width, tokens, i, BUS_COLON); } wire_fsm_fail(); case BUS_COLON: if(((tokens)[*i].getType() == Token::NUMBER) && (atoi((tokens)[*i].getData().c_str()) == 0)){ (*i)++; return parse_wires(wires, wire, width, tokens, i, BUS_LSB); } wire_fsm_fail(); case BUS_LSB: if(!(tokens)[*i].getData().compare("]")){ (*i)++; return parse_wires(wires, wire, width, tokens, i, BUS_DONE); } wire_fsm_fail(); case BUS_DONE: if((tokens)[*i].getType() == Token::NAME){ wire->name = (tokens)[*i].getData(); wires->push_back(wire); (*i)++; return parse_wires(wires, NULL, width, tokens, i, WIRE_NAME); } wire_fsm_fail(); case WIRE_NAME: if(!(tokens)[*i].getData().compare(",")){ (*i)++; return parse_wires(wires, NULL, width, tokens, i, WIRES); } if(!(tokens)[*i].getData().compare(";")){ (*i)++; return parse_wires(wires, wire, width, tokens, i, DONE); } wire_fsm_fail(); case WIRES: while((tokens)[*i].getData().compare(";")){ if(!(tokens)[*i].getData().compare(",")){ (*i)++; continue; } else if((tokens)[*i].getType() == Token::NAME){ wire = new Wire(); wire->name = (tokens)[*i].getData(); wire->width = width; wires->push_back(wire); (*i)++; } else { wire_fsm_fail(); } } (*i)++; return; case DONE: return; } } }