Generate code for the .concat functors, from NetConcat objects.
Generate C<> constants of correct widths for functor arguments.
This commit is contained in:
parent
1674d692b7
commit
83423c978b
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2003 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2004 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: vvp_scope.c,v 1.104 2004/12/11 02:31:29 steve Exp $"
|
#ident "$Id: vvp_scope.c,v 1.105 2004/12/29 23:52:09 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "vvp_priv.h"
|
# include "vvp_priv.h"
|
||||||
|
|
@ -181,6 +181,21 @@ ivl_signal_type_t signal_type_of_nexus(ivl_nexus_t nex)
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned width_of_nexus(ivl_nexus_t nex)
|
||||||
|
{
|
||||||
|
unsigned idx;
|
||||||
|
|
||||||
|
for (idx = 0 ; idx < ivl_nexus_ptrs(nex) ; idx += 1) {
|
||||||
|
ivl_nexus_ptr_t ptr = ivl_nexus_ptr(nex, idx);
|
||||||
|
ivl_signal_t sig = ivl_nexus_ptr_sig(ptr);
|
||||||
|
if (sig != 0)
|
||||||
|
return ivl_signal_width(sig);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ivl_nexus_ptr_t ivl_logic_pin_ptr(ivl_net_logic_t net, unsigned pin)
|
ivl_nexus_ptr_t ivl_logic_pin_ptr(ivl_net_logic_t net, unsigned pin)
|
||||||
{
|
{
|
||||||
ivl_nexus_t nex = ivl_logic_pin(net, pin);
|
ivl_nexus_t nex = ivl_logic_pin(net, pin);
|
||||||
|
|
@ -431,7 +446,7 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IVL_LPM_CONCAT:
|
||||||
case IVL_LPM_CMP_GE:
|
case IVL_LPM_CMP_GE:
|
||||||
case IVL_LPM_CMP_GT:
|
case IVL_LPM_CMP_GT:
|
||||||
case IVL_LPM_CMP_EQ:
|
case IVL_LPM_CMP_EQ:
|
||||||
|
|
@ -771,6 +786,8 @@ static void draw_logic_in_scope(ivl_net_logic_t lptr)
|
||||||
const char*lcasc = 0x0;
|
const char*lcasc = 0x0;
|
||||||
char identity_val = '0';
|
char identity_val = '0';
|
||||||
|
|
||||||
|
unsigned vector_width = width_of_nexus(ivl_logic_pin(lptr, 0));
|
||||||
|
|
||||||
ivl_drive_t str0, str1;
|
ivl_drive_t str0, str1;
|
||||||
|
|
||||||
int level;
|
int level;
|
||||||
|
|
@ -950,7 +967,11 @@ static void draw_logic_in_scope(ivl_net_logic_t lptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for ( ; pdx < inst+4 ; pdx += 1) {
|
for ( ; pdx < inst+4 ; pdx += 1) {
|
||||||
fprintf(vvp_out, ", C4<%c>", identity_val);
|
unsigned wdx;
|
||||||
|
fprintf(vvp_out, ", C4<");
|
||||||
|
for (wdx = 0 ; wdx < vector_width ; wdx += 1)
|
||||||
|
fprintf(vvp_out, "%c", identity_val);
|
||||||
|
fprintf(vvp_out, ">");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(vvp_out, ";\n");
|
fprintf(vvp_out, ";\n");
|
||||||
|
|
@ -1179,6 +1200,31 @@ static void draw_lpm_arith_a_b_inputs(ivl_lpm_t net)
|
||||||
fprintf(vvp_out, ", V_%s", vvp_signal_label(sig));
|
fprintf(vvp_out, ", V_%s", vvp_signal_label(sig));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void draw_lpm_data_inputs(ivl_lpm_t net, unsigned ndata)
|
||||||
|
{
|
||||||
|
unsigned idx;
|
||||||
|
for (idx = 0 ; idx < ndata ; idx += 1) {
|
||||||
|
unsigned width = ivl_lpm_width(net);
|
||||||
|
unsigned pdx;
|
||||||
|
|
||||||
|
assert(width > 0);
|
||||||
|
ivl_nexus_t nex = ivl_lpm_data(net, idx);
|
||||||
|
ivl_signal_t sig = 0;
|
||||||
|
|
||||||
|
ivl_nexus_ptr_t np;
|
||||||
|
for (pdx = 0 ; pdx < ivl_nexus_ptrs(nex) ; pdx += 1) {
|
||||||
|
np = ivl_nexus_ptr(nex,pdx);
|
||||||
|
sig = ivl_nexus_ptr_sig(np);
|
||||||
|
if (sig != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(sig != 0);
|
||||||
|
|
||||||
|
fprintf(vvp_out, ", V_%s", vvp_signal_label(sig));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void draw_lpm_add(ivl_lpm_t net)
|
static void draw_lpm_add(ivl_lpm_t net)
|
||||||
{
|
{
|
||||||
unsigned width;
|
unsigned width;
|
||||||
|
|
@ -1245,6 +1291,34 @@ static void draw_lpm_cmp(ivl_lpm_t net)
|
||||||
fprintf(vvp_out, ";\n");
|
fprintf(vvp_out, ";\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void draw_lpm_concat(ivl_lpm_t net)
|
||||||
|
{
|
||||||
|
unsigned idx;
|
||||||
|
unsigned icnt = ivl_lpm_selects(net);
|
||||||
|
|
||||||
|
/* XXXX For now, only handle concatenation of 4 values. */
|
||||||
|
assert(icnt <= 4);
|
||||||
|
|
||||||
|
fprintf(vvp_out, "L_%s.%s .concat [",
|
||||||
|
vvp_mangle_id(ivl_scope_name(ivl_lpm_scope(net))),
|
||||||
|
vvp_mangle_id(ivl_lpm_basename(net)));
|
||||||
|
|
||||||
|
for (idx = 0 ; idx < icnt ; idx += 1) {
|
||||||
|
ivl_nexus_t nex = ivl_lpm_data(net, idx);
|
||||||
|
unsigned nexus_width = width_of_nexus(nex);
|
||||||
|
fprintf(vvp_out, " %u", nexus_width);
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( ; idx < 4 ; idx += 1)
|
||||||
|
fpritnf(vvp_out, " 0");
|
||||||
|
|
||||||
|
fprintf(vvp_out, "]");
|
||||||
|
|
||||||
|
draw_lpm_data_inputs(net, icnt);
|
||||||
|
|
||||||
|
fprintf(vvp_out, ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Draw == and != gates. This is done as XNOR functors to compare each
|
* Draw == and != gates. This is done as XNOR functors to compare each
|
||||||
* pair of bits. The result is combined with a wide and, or a NAND if
|
* pair of bits. The result is combined with a wide and, or a NAND if
|
||||||
|
|
@ -1515,6 +1589,10 @@ static void draw_lpm_in_scope(ivl_lpm_t net)
|
||||||
draw_lpm_part(net);
|
draw_lpm_part(net);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case IVL_LPM_CONCAT:
|
||||||
|
draw_lpm_concat(net);
|
||||||
|
return;
|
||||||
|
|
||||||
case IVL_LPM_CMP_EQ:
|
case IVL_LPM_CMP_EQ:
|
||||||
case IVL_LPM_CMP_NE:
|
case IVL_LPM_CMP_NE:
|
||||||
draw_lpm_eq(net);
|
draw_lpm_eq(net);
|
||||||
|
|
@ -1665,6 +1743,10 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vvp_scope.c,v $
|
* $Log: vvp_scope.c,v $
|
||||||
|
* Revision 1.105 2004/12/29 23:52:09 steve
|
||||||
|
* Generate code for the .concat functors, from NetConcat objects.
|
||||||
|
* Generate C<> constants of correct widths for functor arguments.
|
||||||
|
*
|
||||||
* Revision 1.104 2004/12/11 02:31:29 steve
|
* Revision 1.104 2004/12/11 02:31:29 steve
|
||||||
* Rework of internals to carry vectors through nexus instead
|
* Rework of internals to carry vectors through nexus instead
|
||||||
* of single bits. Make the ivl, tgt-vvp and vvp initial changes
|
* of single bits. Make the ivl, tgt-vvp and vvp initial changes
|
||||||
|
|
@ -1672,83 +1754,5 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
||||||
*
|
*
|
||||||
* Revision 1.103 2004/10/04 01:10:57 steve
|
* Revision 1.103 2004/10/04 01:10:57 steve
|
||||||
* Clean up spurious trailing white space.
|
* Clean up spurious trailing white space.
|
||||||
*
|
|
||||||
* Revision 1.102 2004/09/25 21:04:25 steve
|
|
||||||
* More carefull about eliding bufzs that carry strength.
|
|
||||||
*
|
|
||||||
* Revision 1.101 2004/09/10 23:13:05 steve
|
|
||||||
* Compile cleanup of C code.
|
|
||||||
*
|
|
||||||
* Revision 1.100 2004/06/30 02:16:27 steve
|
|
||||||
* Implement signed divide and signed right shift in nets.
|
|
||||||
*
|
|
||||||
* Revision 1.99 2004/06/16 23:33:42 steve
|
|
||||||
* Generate .cmp/eq nodes instead of sea of gates.
|
|
||||||
*
|
|
||||||
* Revision 1.98 2003/12/19 01:27:10 steve
|
|
||||||
* Fix various unsigned compare warnings.
|
|
||||||
*
|
|
||||||
* Revision 1.97 2003/10/09 23:45:03 steve
|
|
||||||
* Emit .event inputs before the .event statement.
|
|
||||||
*
|
|
||||||
* Revision 1.96 2003/08/22 23:14:26 steve
|
|
||||||
* Preserve variable ranges all the way to the vpi.
|
|
||||||
*
|
|
||||||
* Revision 1.95 2003/07/30 01:13:28 steve
|
|
||||||
* Add support for triand and trior.
|
|
||||||
*
|
|
||||||
* Revision 1.94 2003/05/29 02:21:45 steve
|
|
||||||
* Implement acc_fetch_defname and its infrastructure in vvp.
|
|
||||||
*
|
|
||||||
* Revision 1.93 2003/05/13 01:56:15 steve
|
|
||||||
* Allow primitives to hvae unconnected input ports.
|
|
||||||
*
|
|
||||||
* Revision 1.92 2003/04/11 05:18:08 steve
|
|
||||||
* Handle signed magnitude compare all the
|
|
||||||
* way through to the vvp code generator.
|
|
||||||
*
|
|
||||||
* Revision 1.91 2003/03/25 02:15:48 steve
|
|
||||||
* Use hash code for scope labels.
|
|
||||||
*
|
|
||||||
* Revision 1.90 2003/03/13 06:07:11 steve
|
|
||||||
* Use %p name for all LPM functors.
|
|
||||||
*
|
|
||||||
* Revision 1.89 2003/03/10 23:40:54 steve
|
|
||||||
* Keep parameter constants for the ivl_target API.
|
|
||||||
*
|
|
||||||
* Revision 1.88 2003/03/06 01:17:46 steve
|
|
||||||
* Use number for event labels.
|
|
||||||
*
|
|
||||||
* Revision 1.87 2003/03/06 00:27:09 steve
|
|
||||||
* Use numbers for functor labels.
|
|
||||||
*
|
|
||||||
* Revision 1.86 2003/03/03 23:05:49 steve
|
|
||||||
* Printed nexus names need not use ivl_nexus_name.
|
|
||||||
*
|
|
||||||
* Revision 1.85 2003/03/03 01:48:41 steve
|
|
||||||
* Only give scope basename to .scope directives.
|
|
||||||
*
|
|
||||||
* Revision 1.84 2003/02/25 03:40:45 steve
|
|
||||||
* Eliminate use of ivl_lpm_name function.
|
|
||||||
*
|
|
||||||
* Revision 1.83 2003/01/26 21:16:00 steve
|
|
||||||
* Rework expression parsing and elaboration to
|
|
||||||
* accommodate real/realtime values and expressions.
|
|
||||||
*
|
|
||||||
* Revision 1.82 2002/12/21 00:55:58 steve
|
|
||||||
* The $time system task returns the integer time
|
|
||||||
* scaled to the local units. Change the internal
|
|
||||||
* implementation of vpiSystemTime the $time functions
|
|
||||||
* to properly account for this. Also add $simtime
|
|
||||||
* to get the simulation time.
|
|
||||||
*
|
|
||||||
* Revision 1.81 2002/11/21 18:08:09 steve
|
|
||||||
* Better handling of select width of shifters.
|
|
||||||
*
|
|
||||||
* Revision 1.80 2002/10/23 04:39:35 steve
|
|
||||||
* draw lpm ff with aset_expr taken into account.
|
|
||||||
*
|
|
||||||
* Revision 1.79 2002/09/26 03:18:04 steve
|
|
||||||
* Generate vvp code for asynch set/reset of NetFF.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue