/* $Id: verilogmodule.h,v 1.19 2002/12/02 14:36:58 sbeyer Exp $ $Log: verilogmodule.h,v $ Revision 1.19 2002/12/02 14:36:58 sbeyer * ported source to gcc-3.2 (still compiles AND WORKS with gcc-2.9x) Revision 1.18 2002/03/27 21:10:11 dirkl *** empty log message *** Revision 1.17 2002/03/27 19:58:39 dirkl *** empty log message *** Revision 1.16 2002/03/24 12:19:14 dirkl - now it really works Revision 1.15 2002/03/21 16:55:51 dirkl - support for multiple connect_outside functions seems to work Revision 1.14 2002/02/25 23:34:16 dirkl - connections of bus_protocol get now connected to the top-level module(very uggly implementation) Revision 1.13 2001/06/12 11:38:44 dirkl - extended support for predefined function:s Revision 1.12 2001/03/17 11:21:03 sbeyer added short names for module instances (XILINX restricts names to 500 characters) Revision 1.11 2001/02/05 13:44:09 sbeyer fixed bug in register support Revision 1.10 2001/02/05 11:14:47 sbeyer added register support Revision 1.9 2001/01/26 15:05:17 sbeyer added check for simple wirename Revision 1.8 2001/01/25 13:09:56 sbeyer removed hdl comments for internal wire names Revision 1.7 2001/01/24 16:51:21 sbeyer added simple 'new_wiredefinition' method (just takes width as argument) Revision 1.6 2001/01/22 18:14:13 sbeyer implemented wire translation and hdl-comments Revision 1.5 2001/01/22 15:08:31 sbeyer added data structures for wire translation support,... Revision 1.4 2001/01/21 17:24:04 sbeyer added member functions that handle whole string lists Revision 1.3 2001/01/18 16:02:10 sbeyer added support for record type wires, added destructor, bug fixes */ #ifndef verilogmodule_h #define verilogmodule_h #include #include #include "stringlist.h" #include #include #include "synthesize_type.h" using namespace std; struct var; struct wire_translator { string pvs_name; string hdl_name; wire_translator() {} wire_translator(const string &_pvs_name, const string &_hdl_name) { pvs_name=_pvs_name; hdl_name=_hdl_name; } }; class VerilogModule { public: VerilogModule(const string &modulename, const type_array &tarray=type_array()); ~VerilogModule(); string name; string new_wiredefinition(const type_array &tarray); string new_wiredefinition(int width); void new_wiredefinition(const string &name, const type_array &tarray); void new_inputparameter(const var ¶m); // erzeugen Eintraege in der Parameterliste des Moduls und legen string new_outputparameter(const type_array &tarray); // input bzw. output Zeilen an und zwar alles in der Aufrufsreihenfolge string new_outside_inputparameter(const var ¶m,bool first,string functionname); /* legt für einen Inputparameter einen zusätzlichen Outputparameter an, der zum Verbinden nach außen benutzt wird */ string new_outside_outputparameter(const type_array &tarray,bool first,string functionname); void new_moduleaufruf(const string &modulename,const string ¶meter,const string feedthrough_parameter=""); // fuegt einen neuen moduleaufruf ein void new_assign(const string &leftside,const string &rightside,bool lookup=true); /* fuegt ein neues 'assign ...' ein lookup gibt an, ob die linke Seite der Zuweisung aus der wire-Liste ersetzt werden soll; bei false wird 1:1 übernommen */ void new_assign(const string &leftside,const string &rightside,const type_array &tarray); void new_assign(const string &leftside,const list &rightside,const type_array &tarray); void create_outside_connections(const defined_function &connect_outside_function); struct stringlisten_eintrag *getanfang() const; // gibt einen Pointer auf das erste Element der Stringliste zurueck string wire_function_call(const string &wire, const type_array &tarray) const; string wire_name(const string &wire) const; list wire_names(const string &wire, const type_array &tarray) const; list wire_name(const string &wire, const type_array &tarray) const; bool is_simple_wire_name(const string &name) const; void free_local_wire_names(int num); string parameter_str; void reset_outside_parameteranzahl(); private: void new_register(int bitbreite,const string &name, int index); void new_wiredefinition(int bitbreite,const string &name,bool is_default_name=false); // erzeugt eine neue Zeile "wire xyz[bitbreite:0] void new_inputparameter(int bitbreite,const string &name); void new_outputparameter(int bitbreite,const string &name); string new_outside_inputparameter(int bitbreite,const string &name,bool first,string functionname); /* first gibt an, ob zwischen den "normalen" Parametern und den bp_ - Parametern ein assign eingefügt werden soll. Das ist im low-level Modul notwendig */ string new_outside_outputparameter(int bitbreite,const string &name,bool first,string functionname); struct stringlisten_eintrag *anfang; // Zeiger auf den ersten Eintrag der Stringlist struct stringlisten_eintrag *wires; // Zeiger auf die Stelle, an der wires eingefuegt werden sollen struct stringlisten_eintrag *assigns; // Zeiger auf die Stelle, an der assigns eingefuegt werden sollen struct stringlisten_eintrag *register_assigns; // Zeiger auf die Stelle, an der Regsiter assigns eingefuegt werden sollen struct stringlisten_eintrag *moduleaufrufe; // ... Stelle, an der moduleaufrufe eingefuegt ... struct stringlisten_eintrag *parameter; // Zeiger auf den letzten schon deklarierten Parameter des Moduls struct stringlisten_eintrag *input_output; // Zeiger auf den letzten Eintrag im input-ouput-Bereich struct stringlisten_eintrag *outside_connection_parameter; /* Zeiger auf die Stelle, an der outside-connection-Parameter eingefügt werden (hinter allen anderen Parametern) */ int parameteranzahl; int outside_parameteranzahl; int module_count, wire_count, internal_wire_count; list translation_tab; type_array register_type; bool register_declared; }; // globale Ausgabefunktion ostream& operator<<(ostream&, const VerilogModule&); #endif // verilogmodule_h