/* $Id: verilogmodule.cpp,v 1.29 2002/04/17 13:51:53 dirkl Exp $ $Log: verilogmodule.cpp,v $ Revision 1.29 2002/04/17 13:51:53 dirkl - added delay #100 to register-assignments (for simulation only) Revision 1.28 2002/03/27 21:10:10 dirkl *** empty log message *** Revision 1.27 2002/03/27 19:58:39 dirkl *** empty log message *** Revision 1.26 2002/03/24 12:19:14 dirkl - now it really works Revision 1.25 2002/03/23 18:38:33 dirkl *** empty log message *** Revision 1.24 2002/03/21 16:55:51 dirkl - support for multiple connect_outside functions seems to work Revision 1.23 2002/03/04 09:53:21 dirkl *** empty log message *** Revision 1.22 2002/02/25 23:34:15 dirkl - connections of bus_protocol get now connected to the top-level module(very uggly implementation) Revision 1.21 2001/10/25 16:39:02 dirkl - new line for each parameter ==> no more "line too long"-error in VerilogXL Revision 1.20 2001/06/12 11:38:44 dirkl - extended support for predefined function:s Revision 1.19 2001/06/12 11:05:45 sbeyer * added clk propagation to all modules Revision 1.18 2001/05/31 14:20:40 sbeyer * completed support for arrays * fixed constant support Revision 1.17 2001/05/30 18:07:59 sbeyer * added array and ram support in types * BETA support for function lookup table Revision 1.16 2001/05/17 12:12:20 dirkl - added command-line option --no-translation Revision 1.15 2001/03/17 11:21:03 sbeyer added short names for module instances (XILINX restricts names to 500 characters) Revision 1.14 2001/03/14 11:13:11 sbeyer all signal names now end with 'x' (no longer with a number) Revision 1.13 2001/02/05 13:44:09 sbeyer fixed bug in register support Revision 1.12 2001/02/05 11:14:46 sbeyer added register support Revision 1.11 2001/01/26 15:11:18 sbeyer added cvs log */ #include "verilogmodule.h" #include "synthesize_core.h" VerilogModule::VerilogModule(const string &modulename, const type_array &_register_type/*=type_array()*/) { parameteranzahl=outside_parameteranzahl=module_count=wire_count=internal_wire_count=0; register_type=_register_type; register_declared=false; anfang=newstringlist("module "); stringlist_append(anfang,modulename.c_str()); name=modulename; parameter=stringlist_append(anfang,"("); outside_connection_parameter=stringlist_append(anfang," "); input_output=stringlist_append(anfang,");\n"); wires=stringlist_append(anfang,"\n"); assigns=stringlist_append(anfang,"\n"); register_assigns=stringlist_append(anfang,"\n"); moduleaufrufe=stringlist_append(anfang,"\n"); stringlist_append(anfang,"\nendmodule\n"); // add clk parameter to every module parameter=stringlist_einfuegen(parameter,"clk"); parameter_str="clk"; input_output=stringlist_einfuegen(input_output,"\tinput clk;\n"); } VerilogModule::~VerilogModule() { stringlist_freigeben(anfang); } void VerilogModule::reset_outside_parameteranzahl() { outside_parameteranzahl=0; } void VerilogModule::new_wiredefinition(int bitbreite, const string &name, bool is_default_name/*=false*/) { char merke[11]; // !!! bitbreite hat hoechstens 5 Stellen wires=stringlist_einfuegen(wires,"\twire "); if (bitbreite>1) { sprintf(merke,"[%d:0] ",bitbreite-1); wires=stringlist_einfuegen(wires,merke); } sprintf(merke,"wire%ix",internal_wire_count++); translation_tab.push_front(wire_translator(name,merke)); wires=stringlist_einfuegen(wires,merke); wires=stringlist_einfuegen(wires,";"); if (parameter_hdl_comment && !is_default_name) wires=stringlist_einfuegen(wires,("\t// external name: "+name).c_str()); wires=stringlist_einfuegen(wires,"\n"); } void VerilogModule::new_inputparameter(int bitbreite,const string &name) { char merke[10],tmp[10]; // !!! bitbreite hat hoechstens 5 Stellen // parameter deklarieren parameter=stringlist_einfuegen(parameter,",\n\t\t"); sprintf(tmp,"a_%ix",parameteranzahl); translation_tab.push_front(wire_translator(name,tmp)); parameteranzahl++; parameter=stringlist_einfuegen(parameter,tmp); // parameter_string parameter_str+=",\n\t\t"+string(tmp); // Typ des Parameters angeben input_output=stringlist_einfuegen(input_output,"\tinput "); if (bitbreite>1) { sprintf(merke,"[%d:0] ",bitbreite-1); input_output=stringlist_einfuegen(input_output,merke); } input_output=stringlist_einfuegen(input_output,tmp); input_output=stringlist_einfuegen(input_output,";"); if (parameter_hdl_comment) input_output=stringlist_einfuegen(input_output,("\t// external name: "+name).c_str()); input_output=stringlist_einfuegen(input_output,"\n"); } string VerilogModule::new_outside_inputparameter(int bitbreite,const string &name,bool first,string functionname) { char merke[10],tmp[512], tmp2[10]; // !!! bitbreite hat hoechstens 5 Stellen string returns=""; // parameter deklarieren outside_connection_parameter=stringlist_einfuegen(outside_connection_parameter,",\n\t\t"); sprintf(tmp,("bp_" + functionname + "_a%ix").c_str(),outside_parameteranzahl); sprintf(tmp2,"a_%ix",outside_parameteranzahl); returns=string(tmp); translation_tab.push_front(wire_translator(name,tmp)); outside_parameteranzahl++; outside_connection_parameter=stringlist_einfuegen(outside_connection_parameter,tmp); // parameter_string parameter_str+=",\n\t\t"+string(tmp); // Typ des Parameters angeben input_output=stringlist_einfuegen(input_output,"\toutput "); if (bitbreite>1) { sprintf(merke,"[%d:0] ",bitbreite-1); input_output=stringlist_einfuegen(input_output,merke); } input_output=stringlist_einfuegen(input_output,tmp); input_output=stringlist_einfuegen(input_output,";"); if (parameter_hdl_comment) input_output=stringlist_einfuegen(input_output,"\t// connection to TOP-Level Modul: "); input_output=stringlist_einfuegen(input_output,"\n"); // falls first=true wird noch ein assign eingefügt if (first) { this->new_assign(string(tmp),string(tmp2),false); } return returns; } void VerilogModule::new_outputparameter(int bitbreite,const string &name) { char merke[10],tmp[10]; // !!! bitbreite hat hoechstens 5 Stellen // parameter deklarieren parameter=stringlist_einfuegen(parameter,",\n\t\t"); sprintf(tmp,"out_%ix",parameteranzahl); translation_tab.push_front(wire_translator(name,tmp)); parameteranzahl++; parameter=stringlist_einfuegen(parameter,tmp); // parameter_string parameter_str+=",\n\t\t"+string(tmp); // Typ des Parameters angeben input_output=stringlist_einfuegen(input_output,"\toutput "); if (bitbreite>1) { sprintf(merke,"[%d:0] ",bitbreite-1); input_output=stringlist_einfuegen(input_output,merke); } input_output=stringlist_einfuegen(input_output,tmp); input_output=stringlist_einfuegen(input_output,";"); if (parameter_hdl_comment) input_output=stringlist_einfuegen(input_output,("\t// external name: "+name).c_str()); input_output=stringlist_einfuegen(input_output,"\n"); } string VerilogModule::new_outside_outputparameter(int bitbreite,const string &name,bool first,string functionname) { char merke[10],tmp[512], tmp2[10]; // !!! bitbreite hat hoechstens 5 Stellen string returns=""; // parameter deklarieren outside_connection_parameter=stringlist_einfuegen(outside_connection_parameter,",\n\t\t"); sprintf(tmp,("bp_" + functionname + "_out%ix").c_str(),outside_parameteranzahl); returns=string(tmp); sprintf(tmp2,"out_%ix",outside_parameteranzahl); translation_tab.push_front(wire_translator(name,tmp)); outside_parameteranzahl++; outside_connection_parameter=stringlist_einfuegen(outside_connection_parameter,tmp); // parameter_string parameter_str+=",\n\t\t"+string(tmp); // Typ des Parameters angeben input_output=stringlist_einfuegen(input_output,"\tinput "); if (bitbreite>1) { sprintf(merke,"[%d:0] ",bitbreite-1); input_output=stringlist_einfuegen(input_output,merke); } input_output=stringlist_einfuegen(input_output,tmp); input_output=stringlist_einfuegen(input_output,";"); if (parameter_hdl_comment) input_output=stringlist_einfuegen(input_output,"\t// connection to TOP-Level Modul:"); input_output=stringlist_einfuegen(input_output,"\n"); // falls first=true wird noch ein assign eingefügt if (first) { this->new_assign(string(tmp2),string(tmp),false); } return returns; } void VerilogModule::new_register(int bitbreite,const string &name, int index) { char merke[10]; // !!! bitbreite hat hoechstens 5 Stellen wires=stringlist_einfuegen(wires,"\treg "); if (bitbreite>1) { sprintf(merke,"[%d:0] ",bitbreite-1); wires=stringlist_einfuegen(wires,merke); } sprintf(merke,"reg_%ix",index); translation_tab.push_front(wire_translator(name,merke)); wires=stringlist_einfuegen(wires,merke); wires=stringlist_einfuegen(wires,";"); if (parameter_hdl_comment) wires=stringlist_einfuegen(wires,("\t// external name: "+name).c_str()); wires=stringlist_einfuegen(wires,"\n"); } string VerilogModule::new_wiredefinition(const type_array &tarray) { char name[16]; snprintf(name,16,"wire%i`",wire_count++); for (int i=0;i=reg_start && i=reg_start && i::const_iterator i=translation_tab.begin(); while (i!= translation_tab.end()) { if (i->pvs_name==wire) return i->hdl_name; i++; } raise_error(cout << "internal error: pvs wire name " << wire << " not declared!\n"); } } list VerilogModule::wire_names(const string &wire, const type_array &tarray) const { list ret; for (int i=0;i::const_iterator i=translation_tab.begin(); while (i!= translation_tab.end()) { if (i->hdl_name==name) return true; i++; } return false; } void VerilogModule::free_local_wire_names(int num) { for (int i=0;i &rightside,const type_array &tarray) { list::const_iterator j=rightside.begin(); for (int i=0;itext; temp=temp->next; } return ausgabe << endl; // append extra newline }