Generate .net/2x records for IVL_VT_BOOL type nets.

The code generator writes out the proper .net/2x records for
atom2 types, and the vvp run-time parses and interprets those
records.
This commit is contained in:
Stephen Williams 2010-10-10 19:39:58 -07:00
parent ee25f0f217
commit 4643872fc6
5 changed files with 82 additions and 54 deletions

View File

@ -477,6 +477,12 @@ static void draw_net_in_scope(ivl_signal_t sig)
unsigned iword; unsigned iword;
switch (ivl_signal_data_type(sig)) { switch (ivl_signal_data_type(sig)) {
case IVL_VT_BOOL:
if (ivl_signal_signed(sig))
datatype_flag = "/2s";
else
datatype_flag = "/2u";
break;
case IVL_VT_REAL: case IVL_VT_REAL:
datatype_flag = "/real"; datatype_flag = "/real";
break; break;

View File

@ -443,19 +443,29 @@ extern void compile_variable(char*label, char*name,
extern void compile_var_real(char*label, char*name, extern void compile_var_real(char*label, char*name,
int msb, int lsb); int msb, int lsb);
extern void compile_net(char*label, char*name, /*
int msb, int lsb, bool signed_flag, * The compile_net functio is called to create a .net vector with a
bool net8_flag, bool local_flag, * given name.
*
* The vpi_type_code argument of compile_net() is one of the vpi
* object codes for the equivelent variable types. The supported codes
* are:
* vpiLogic -- 4-value logic
* vpiIntVar -- 2-value logic
* -vpiLogic -- 8-value (i.e. strength aware) logic
*/
extern void compile_net(char*label, char*name, int msb, int lsb,
int vpi_type_code, bool signed_flag, bool local_flag,
unsigned argc, struct symb_s*argv); unsigned argc, struct symb_s*argv);
extern void compile_net_real(char*label, char*name, extern void compile_net_real(char*label, char*name,
int msb, int lsb, bool local_flag, int msb, int lsb, bool local_flag,
unsigned argc, struct symb_s*argv); unsigned argc, struct symb_s*argv);
extern void compile_netw(char*label, char*array_symbol, extern void compile_netw(char*label, char*array_label, unsigned long array_addr,
unsigned long array_addr, int msb, int lsb, int vpi_type_code, bool signed_flag,
int msb, int lsb, bool signed_flag,
bool net8_flag,
unsigned argc, struct symb_s*argv); unsigned argc, struct symb_s*argv);
extern void compile_netw_real(char*label, char*array_symbol, extern void compile_netw_real(char*label, char*array_symbol,
unsigned long array_addr, unsigned long array_addr,
int msb, int lsb, int msb, int lsb,

View File

@ -148,8 +148,10 @@ static char* strdupnew(char const *str)
".functor" { return K_FUNCTOR; } ".functor" { return K_FUNCTOR; }
".import" { return K_IMPORT; } ".import" { return K_IMPORT; }
".island" { return K_ISLAND; } ".island" { return K_ISLAND; }
".modpath" { return K_MODPATH; } ".modpath" { return K_MODPATH; }
".net" { return K_NET; } ".net" { return K_NET; }
".net/2s" { return K_NET_2S; }
".net/2u" { return K_NET_2U; }
".net8" { return K_NET8; } ".net8" { return K_NET8; }
".net8/s" { return K_NET8_S; } ".net8/s" { return K_NET8_S; }
".net/real" { return K_NET_R; } ".net/real" { return K_NET_R; }

View File

@ -76,8 +76,8 @@ static struct __vpiModPath*modpath_dst = 0;
%token K_CMP_GE K_CMP_GE_R K_CMP_GE_S K_CMP_GT K_CMP_GT_R K_CMP_GT_S %token K_CMP_GE K_CMP_GE_R K_CMP_GE_S K_CMP_GT K_CMP_GT_R K_CMP_GT_S
%token K_CONCAT K_DEBUG K_DELAY K_DFF %token K_CONCAT K_DEBUG K_DELAY K_DFF
%token K_EVENT K_EVENT_OR K_EXPORT K_EXTEND_S K_FUNCTOR K_IMPORT K_ISLAND %token K_EVENT K_EVENT_OR K_EXPORT K_EXTEND_S K_FUNCTOR K_IMPORT K_ISLAND
%token K_MODPATH K_NET K_NET_S K_NET_R %token K_MODPATH
%token K_NET8 K_NET8_S %token K_NET K_NET_S K_NET_R K_NET_2S K_NET_2U K_NET8 K_NET8_S
%token K_PARAM_STR K_PARAM_L K_PARAM_REAL K_PART K_PART_PV %token K_PARAM_STR K_PARAM_L K_PARAM_REAL K_PART K_PART_PV
%token K_PART_V K_PART_V_S K_PORT K_PV K_REDUCE_AND K_REDUCE_OR K_REDUCE_XOR %token K_PART_V K_PART_V_S K_PORT K_PV K_REDUCE_AND K_REDUCE_OR K_REDUCE_XOR
%token K_REDUCE_NAND K_REDUCE_NOR K_REDUCE_XNOR K_REPEAT %token K_REDUCE_NAND K_REDUCE_NOR K_REDUCE_XNOR K_REPEAT
@ -673,19 +673,27 @@ statement
| T_LABEL K_NET local_flag T_STRING ',' signed_t_number signed_t_number | T_LABEL K_NET local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $4, $6, $7, false, false, $3, $9.cnt, $9.vect); } { compile_net($1, $4, $6, $7, vpiLogicVar, false, $3, $9.cnt, $9.vect); }
| T_LABEL K_NET_S local_flag T_STRING ',' signed_t_number signed_t_number | T_LABEL K_NET_S local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $4, $6, $7, true, false, $3, $9.cnt, $9.vect); } { compile_net($1, $4, $6, $7, vpiLogicVar, true, $3, $9.cnt, $9.vect); }
| T_LABEL K_NET_2U local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';'
{ compile_net($1, $4, $6, $7, vpiIntVar, false, $3, $9.cnt, $9.vect); }
| T_LABEL K_NET_2S local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';'
{ compile_net($1, $4, $6, $7, vpiIntVar, true, $3, $9.cnt, $9.vect); }
| T_LABEL K_NET8 local_flag T_STRING ',' signed_t_number signed_t_number | T_LABEL K_NET8 local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $4, $6, $7, false, true, $3, $9.cnt, $9.vect); } { compile_net($1, $4, $6, $7, -vpiLogicVar, false, $3, $9.cnt, $9.vect); }
| T_LABEL K_NET8_S local_flag T_STRING ',' signed_t_number signed_t_number | T_LABEL K_NET8_S local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
{ compile_net($1, $4, $6, $7, true, true, $3, $9.cnt, $9.vect); } { compile_net($1, $4, $6, $7, -vpiLogicVar, true, $3, $9.cnt, $9.vect); }
| T_LABEL K_NET_R local_flag T_STRING ',' signed_t_number signed_t_number | T_LABEL K_NET_R local_flag T_STRING ',' signed_t_number signed_t_number
',' symbols_net ';' ',' symbols_net ';'
@ -693,30 +701,25 @@ statement
/* Arrayed versions of net directives. */ /* Arrayed versions of net directives. */
| T_LABEL K_NET T_SYMBOL T_NUMBER ',' | T_LABEL K_NET T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ','
signed_t_number signed_t_number ',' symbols_net ';'
symbols_net ';' { compile_netw($1, $3, $4, $6, $7, vpiLogicVar, false, $9.cnt, $9.vect); }
{ compile_netw($1, $3, $4, $6, $7, false, false, $9.cnt, $9.vect); }
| T_LABEL K_NET_S T_SYMBOL T_NUMBER ',' | T_LABEL K_NET_S T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ','
signed_t_number signed_t_number ',' symbols_net ';'
symbols_net ';' { compile_netw($1, $3, $4, $6, $7, vpiLogicVar, true, $9.cnt, $9.vect); }
{ compile_netw($1, $3, $4, $6, $7, true, false, $9.cnt, $9.vect); }
| T_LABEL K_NET8 T_SYMBOL T_NUMBER ',' | T_LABEL K_NET8 T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ','
signed_t_number signed_t_number ',' symbols_net ';'
symbols_net ';' { compile_netw($1, $3, $4, $6, $7, -vpiLogicVar, false, $9.cnt, $9.vect); }
{ compile_netw($1, $3, $4, $6, $7, false, true, $9.cnt, $9.vect); }
| T_LABEL K_NET8_S T_SYMBOL T_NUMBER ',' | T_LABEL K_NET8_S T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ','
signed_t_number signed_t_number ',' symbols_net ';'
symbols_net ';' { compile_netw($1, $3, $4, $6, $7, -vpiLogicVar, true, $9.cnt, $9.vect); }
{ compile_netw($1, $3, $4, $6, $7, true, true, $9.cnt, $9.vect); }
| T_LABEL K_NET_R T_SYMBOL T_NUMBER ',' | T_LABEL K_NET_R T_SYMBOL T_NUMBER ',' signed_t_number signed_t_number ','
signed_t_number signed_t_number ',' symbols_net ';'
symbols_net ';' { compile_netw_real($1, $3, $4, $6, $7, $9.cnt, $9.vect); }
{ compile_netw_real($1, $3, $4, $6, $7, $9.cnt, $9.vect); }
/* Array word versions of alias directives. */ /* Array word versions of alias directives. */

View File

@ -208,12 +208,12 @@ class __compile_net_resolv : public base_net_resolv {
struct __vpiScope*scope, struct __vpiScope*scope,
char*my_label, char*name, char*my_label, char*name,
int msb, int lsb, unsigned array_addr, int msb, int lsb, unsigned array_addr,
bool signed_flag, bool net8_flag, bool local_flag) int vpi_type_code, bool signed_flag, bool local_flag)
: base_net_resolv(ref_label, array, scope, my_label, name, array_addr, local_flag) : base_net_resolv(ref_label, array, scope, my_label, name, array_addr, local_flag)
{ msb_ = msb; { msb_ = msb;
lsb_ = lsb; lsb_ = lsb;
vpi_type_code_ = vpi_type_code;
signed_flag_ = signed_flag; signed_flag_ = signed_flag;
net8_flag_ = net8_flag;
} }
~__compile_net_resolv() { } ~__compile_net_resolv() { }
@ -222,7 +222,8 @@ class __compile_net_resolv : public base_net_resolv {
private: private:
int msb_, lsb_; int msb_, lsb_;
bool signed_flag_, net8_flag_; int vpi_type_code_;
bool signed_flag_;
}; };
/* /*
@ -241,7 +242,7 @@ static void do_compile_net(vvp_net_t*node, vvp_array_t array,
struct __vpiScope*scope, struct __vpiScope*scope,
char*my_label, char*name, char*my_label, char*name,
int msb, int lsb, unsigned array_addr, int msb, int lsb, unsigned array_addr,
bool signed_flag, bool net8_flag, bool local_flag) int vpi_type_code, bool signed_flag, bool local_flag)
{ {
unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1; unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1;
assert(node); assert(node);
@ -249,10 +250,18 @@ static void do_compile_net(vvp_net_t*node, vvp_array_t array,
vvp_wire_base*vsig = dynamic_cast<vvp_wire_base*>(node->fil); vvp_wire_base*vsig = dynamic_cast<vvp_wire_base*>(node->fil);
if (vsig == 0) { if (vsig == 0) {
vsig = net8_flag switch (vpi_type_code) {
? dynamic_cast<vvp_wire_base*>(new vvp_wire_vec8(wid)) case vpiLogicVar:
: dynamic_cast<vvp_wire_base*>(new vvp_wire_vec4(wid,BIT4_Z)); vsig = new vvp_wire_vec4(wid,BIT4_Z);
break;
case -vpiLogicVar:
vsig = new vvp_wire_vec8(wid);
break;
case vpiIntVar:
vsig = new vvp_wire_vec4(wid,BIT4_Z);
break;
}
assert(vsig);
node->fil = vsig; node->fil = vsig;
} }
@ -285,7 +294,7 @@ static void do_compile_net(vvp_net_t*node, vvp_array_t array,
static void __compile_net(char*label, static void __compile_net(char*label,
char*name, char*array_label, unsigned long array_addr, char*name, char*array_label, unsigned long array_addr,
int msb, int lsb, int msb, int lsb,
bool signed_flag, bool net8_flag, bool local_flag, int vpi_type_code, bool signed_flag, bool local_flag,
unsigned argc, struct symb_s*argv) unsigned argc, struct symb_s*argv)
{ {
vvp_array_t array = array_label? array_find(array_label) : 0; vvp_array_t array = array_label? array_find(array_label) : 0;
@ -312,7 +321,7 @@ static void __compile_net(char*label,
= new __compile_net_resolv(argv[0].text, = new __compile_net_resolv(argv[0].text,
array, scope, label, name, array, scope, label, name,
msb, lsb, array_addr, msb, lsb, array_addr,
signed_flag, net8_flag, local_flag); vpi_type_code, signed_flag, local_flag);
resolv_submit(res); resolv_submit(res);
free(argv); free(argv);
return; return;
@ -321,7 +330,7 @@ static void __compile_net(char*label,
struct __vpiScope*scope = vpip_peek_current_scope(); struct __vpiScope*scope = vpip_peek_current_scope();
do_compile_net(node, array, scope, label, name, msb, lsb, array_addr, do_compile_net(node, array, scope, label, name, msb, lsb, array_addr,
signed_flag, net8_flag, local_flag); vpi_type_code, signed_flag, local_flag);
free(argv[0].text); free(argv[0].text);
free(argv); free(argv);
@ -334,30 +343,28 @@ bool __compile_net_resolv::resolve(bool msg_flag)
return false; return false;
} }
do_compile_net(node, array_, scope_, my_label_, name_, msb_, lsb_, array_addr_, signed_flag_, net8_flag_, local_flag_); do_compile_net(node, array_, scope_, my_label_, name_, msb_, lsb_, array_addr_, vpi_type_code_, signed_flag_, local_flag_);
return true; return true;
} }
void compile_net(char*label, char*name, int msb, int lsb, void compile_net(char*label, char*name, int msb, int lsb,
bool signed_flag, bool net8_flag, bool local_flag, int vpi_type_code, bool signed_flag, bool local_flag,
unsigned argc, struct symb_s*argv) unsigned argc, struct symb_s*argv)
{ {
__compile_net(label, name, 0, 0, __compile_net(label, name, 0, 0, msb, lsb,
msb, lsb, signed_flag, net8_flag, local_flag, vpi_type_code, signed_flag, local_flag,
argc, argv); argc, argv);
} }
void compile_netw(char*label, char*array_label, unsigned long array_addr, void compile_netw(char*label, char*array_label, unsigned long array_addr,
int msb, int lsb, int msb, int lsb, int vpi_type_code, bool signed_flag,
bool signed_flag, bool net8_flag, unsigned argc, struct symb_s*argv)
unsigned argc, struct symb_s*argv)
{ {
__compile_net(label, 0, array_label, array_addr, __compile_net(label, 0, array_label, array_addr,
msb, lsb, signed_flag, net8_flag, false, msb, lsb, vpi_type_code, signed_flag, false,
argc, argv); argc, argv);
} }
class __compile_real_net_resolv : public base_net_resolv { class __compile_real_net_resolv : public base_net_resolv {
public: public: