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:
parent
ee25f0f217
commit
4643872fc6
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
|
|
|
||||||
55
vvp/parse.y
55
vvp/parse.y
|
|
@ -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. */
|
||||||
|
|
||||||
|
|
|
||||||
47
vvp/words.cc
47
vvp/words.cc
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue