Signals may receive part vectors from %set/x0

instructions. Re-implement the %set/x0 to do
 just that. Remove the useless %set/x0/x instruction.
This commit is contained in:
steve 2005-02-14 01:50:23 +00:00
parent ff067bb959
commit c5e7e2ec0a
5 changed files with 99 additions and 62 deletions

View File

@ -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: compile.cc,v 1.186 2005/02/12 03:27:18 steve Exp $" #ident "$Id: compile.cc,v 1.187 2005/02/14 01:50:23 steve Exp $"
#endif #endif
# include "arith.h" # include "arith.h"
@ -148,8 +148,8 @@ const static struct opcode_table_s opcode_table[] = {
{ "%set/m", of_SET_MEM,2, {OA_MEM_PTR, OA_BIT1, OA_NONE} }, { "%set/m", of_SET_MEM,2, {OA_MEM_PTR, OA_BIT1, OA_NONE} },
{ "%set/v", of_SET_VEC,3, {OA_FUNC_PTR, OA_BIT1, OA_BIT2} }, { "%set/v", of_SET_VEC,3, {OA_FUNC_PTR, OA_BIT1, OA_BIT2} },
{ "%set/wr", of_SET_WORDR,2,{OA_VPI_PTR, OA_BIT1, OA_NONE} }, { "%set/wr", of_SET_WORDR,2,{OA_VPI_PTR, OA_BIT1, OA_NONE} },
{ "%set/x0", of_SET_X0, 3, {OA_FUNC_PTR, OA_BIT1, OA_BIT2} }, { "%set/x0", of_SET_X0, 2, {OA_FUNC_PTR, OA_BIT1, OA_NONE} },
{ "%set/x0/x",of_SET_X0_X,3,{OA_FUNC_PTR, OA_BIT1, OA_BIT2} }, // { "%set/x0/x",of_SET_X0_X,3,{OA_FUNC_PTR, OA_BIT1, OA_BIT2} },
{ "%shiftl/i0", of_SHIFTL_I0, 2, {OA_BIT1,OA_NUMBER, OA_NONE} }, { "%shiftl/i0", of_SHIFTL_I0, 2, {OA_BIT1,OA_NUMBER, OA_NONE} },
{ "%shiftr/i0", of_SHIFTR_I0, 2, {OA_BIT1,OA_NUMBER, OA_NONE} }, { "%shiftr/i0", of_SHIFTR_I0, 2, {OA_BIT1,OA_NUMBER, OA_NONE} },
{ "%shiftr/s/i0", of_SHIFTR_S_I0,2,{OA_BIT1,OA_NUMBER, OA_NONE} }, { "%shiftr/s/i0", of_SHIFTR_S_I0,2,{OA_BIT1,OA_NUMBER, OA_NONE} },
@ -1618,6 +1618,11 @@ void compile_param_string(char*label, char*name, char*str, char*value)
/* /*
* $Log: compile.cc,v $ * $Log: compile.cc,v $
* Revision 1.187 2005/02/14 01:50:23 steve
* Signals may receive part vectors from %set/x0
* instructions. Re-implement the %set/x0 to do
* just that. Remove the useless %set/x0/x instruction.
*
* Revision 1.186 2005/02/12 03:27:18 steve * Revision 1.186 2005/02/12 03:27:18 steve
* Support C8 constants. * Support C8 constants.
* *

View File

@ -1,7 +1,7 @@
/* /*
* Copyright (c) 2001-2003 Stephen Williams (steve@icarus.com) * Copyright (c) 2001-2003 Stephen Williams (steve@icarus.com)
* *
* $Id: opcodes.txt,v 1.59 2005/01/22 00:58:22 steve Exp $ * $Id: opcodes.txt,v 1.60 2005/02/14 01:50:23 steve Exp $
*/ */
@ -520,22 +520,18 @@ sets only a single bit.
This instruction writes a real word to the specified VPI-like object. This instruction writes a real word to the specified VPI-like object.
* %set/x0 <var-label>, <bit>, <top> * %set/x0 <var-label>, <bit>
* %set/x0/x <var-label>, <bit>, <word>
This sets the bit of a variable functor, the address calculated by This sets the bit of a signal vector, the address calculated by
using the index register 0 to index the functor address of using the index register 0 to index the bit within the vector of
<var-label>. <var-label>. The destination must be a signal of some sort. Otherwise,
the instrution will fail.
If the index value in index register is <0 (for example if %ix/get If the index value in index register is <0 (for example if %ix/get
converted an unknown value into the register) then the set is not converted an unknown value into the register) then the set is not
performed. Also, if the index value is > the immediate top value, then performed. Also, if the index value is beyond the width of the target
the set is not performed. The 0 and <top> values suffice to provide signal, then the set is not performed. The instruction gets the
complete bounds checking. dimensions of the target signal from the signal itself.
The %set/x0/x instruction is the same, except the bound value is in
a word register instead of in the opcode. This allows for bounds that
are larger then 0xffff.
* %shiftl/i0 <bit>, <wid> * %shiftl/i0 <bit>, <wid>

View File

@ -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: vthread.cc,v 1.128 2005/02/12 06:13:22 steve Exp $" #ident "$Id: vthread.cc,v 1.129 2005/02/14 01:50:23 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -2657,64 +2657,39 @@ bool of_SET_WORDR(vthread_t thr, vvp_code_t cp)
/* /*
* Implement the %set/x instruction: * Implement the %set/x instruction:
* *
* %set/x <functor>, <bit>, <idx> * %set/x <functor>, <bit>
* *
* The single bit goes into the indexed functor. Abort the instruction * The single bit goes into the indexed functor. Abort the instruction
* if the index is <0. * if the index is outside the target vector dimensions. Get the
* target vector dimensions from the vvp_fun_signal addressed by the
* vvp_net pointer.
*/ */
bool of_SET_X0(vthread_t thr, vvp_code_t cp) bool of_SET_X0(vthread_t thr, vvp_code_t cp)
{ {
unsigned char bit_val = thr_get_bit(thr, cp->bit_idx[0]); vvp_net_t*net = cp->net;
vvp_bit4_t bit_val = thr_get_bit(thr, cp->bit_idx[0]);
// Implicitly, we get the base into the target vector from the
// X0 register.
long idx = thr->words[0].w_int; long idx = thr->words[0].w_int;
vvp_fun_signal*sig = dynamic_cast<vvp_fun_signal*> (net->fun);
/* If idx < 0, then the index value is probably generated from /* If idx < 0, then the index value is probably generated from
an undefined value. At any rate, this is defined to have no an undefined value. At any rate, this is defined to have no
effect so quit now. */ effect so quit now. */
if (idx < 0) if (idx < 0)
return true; return true;
if ((unsigned)idx > cp->bit_idx[1]) if ((unsigned)idx >= sig->size())
return true; return true;
#if 0 // Make a 1-bit vector that will go to the target
/* Form the functor pointer from the base pointer and the vvp_vector4_t bit (1);
index from the index register. */ bit.set_bit(0, bit_val);
vvp_ipoint_t itmp = ipoint_index(cp->iptr, idx);
/* Set the value. */ vvp_net_ptr_t ptr (net, 0);
functor_set(itmp, bit_val, strong_values[bit_val], true); vvp_send_vec4_pv(ptr, bit, idx, 1, sig->size());
#else
fprintf(stderr, "XXXX forgot how to implement %%set/x0\n");
#endif
return true;
}
bool of_SET_X0_X(vthread_t thr, vvp_code_t cp)
{
unsigned char bit_val = thr_get_bit(thr, cp->bit_idx[0]);
long idx = thr->words[0].w_int;
long lim = thr->words[cp->bit_idx[1]].w_int;
/* If idx < 0, then the index value is probably generated from
an undefined value. At any rate, this is defined to have no
effect so quit now. */
if (idx < 0)
return true;
if (idx > lim)
return true;
#if 0
/* Form the functor pointer from the base pointer and the
index from the index register. */
vvp_ipoint_t itmp = ipoint_index(cp->iptr, idx);
/* Set the value. */
functor_set(itmp, bit_val, strong_values[bit_val], true);
#else
fprintf(stderr, "XXXX forgot how to implement %%set/x0/x\n");
#endif
return true; return true;
} }
@ -3067,6 +3042,11 @@ bool of_JOIN_UFUNC(vthread_t thr, vvp_code_t cp)
/* /*
* $Log: vthread.cc,v $ * $Log: vthread.cc,v $
* Revision 1.129 2005/02/14 01:50:23 steve
* Signals may receive part vectors from %set/x0
* instructions. Re-implement the %set/x0 to do
* just that. Remove the useless %set/x0/x instruction.
*
* Revision 1.128 2005/02/12 06:13:22 steve * Revision 1.128 2005/02/12 06:13:22 steve
* Add debug dumps for vectors, and fix vvp_scaler_t make from BIT4_X values. * Add debug dumps for vectors, and fix vvp_scaler_t make from BIT4_X values.
* *

View File

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#ident "$Id: vvp_net.cc,v 1.16 2005/02/12 06:13:22 steve Exp $" #ident "$Id: vvp_net.cc,v 1.17 2005/02/14 01:50:23 steve Exp $"
# include "vvp_net.h" # include "vvp_net.h"
# include <stdio.h> # include <stdio.h>
@ -607,6 +607,7 @@ void vvp_net_fun_t::recv_long(vvp_net_ptr_t, long)
/* **** vvp_fun_signal methods **** */ /* **** vvp_fun_signal methods **** */
vvp_fun_signal::vvp_fun_signal(unsigned wid) vvp_fun_signal::vvp_fun_signal(unsigned wid)
: bits4_(wid)
{ {
vpi_callbacks = 0; vpi_callbacks = 0;
continuous_assign_active_ = false; continuous_assign_active_ = false;
@ -657,6 +658,31 @@ void vvp_fun_signal::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit)
} }
} }
void vvp_fun_signal::recv_vec4_pv(vvp_net_ptr_t ptr, vvp_vector4_t bit,
unsigned base, unsigned wid, unsigned vwid)
{
assert(bit.size() == wid);
assert(bits4_.size() == vwid);
switch (ptr.port()) {
case 0: // Normal input
if (! continuous_assign_active_) {
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
if (base+idx >= bits4_.size())
break;
bits4_.set_bit(base+idx, bit.value(idx));
}
vvp_send_vec4(ptr.ptr()->out, bits4_);
run_vpi_callbacks();
}
break;
default:
assert(0);
break;
}
}
void vvp_fun_signal::recv_vec8(vvp_net_ptr_t ptr, vvp_vector8_t bit) void vvp_fun_signal::recv_vec8(vvp_net_ptr_t ptr, vvp_vector8_t bit)
{ {
// Only port-0 supports vector8_t inputs. // Only port-0 supports vector8_t inputs.
@ -1098,6 +1124,11 @@ vvp_bit4_t compare_gtge_signed(const vvp_vector4_t&a,
/* /*
* $Log: vvp_net.cc,v $ * $Log: vvp_net.cc,v $
* Revision 1.17 2005/02/14 01:50:23 steve
* Signals may receive part vectors from %set/x0
* instructions. Re-implement the %set/x0 to do
* just that. Remove the useless %set/x0/x instruction.
*
* Revision 1.16 2005/02/12 06:13:22 steve * Revision 1.16 2005/02/12 06:13:22 steve
* Add debug dumps for vectors, and fix vvp_scaler_t make from BIT4_X values. * Add debug dumps for vectors, and fix vvp_scaler_t make from BIT4_X values.
* *

View File

@ -18,7 +18,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#ident "$Id: vvp_net.h,v 1.16 2005/02/13 05:26:30 steve Exp $" #ident "$Id: vvp_net.h,v 1.17 2005/02/14 01:50:23 steve Exp $"
# include <stdio.h> # include <stdio.h>
# include <assert.h> # include <assert.h>
@ -338,7 +338,23 @@ extern void vvp_send_real(vvp_net_ptr_t ptr, double val);
extern void vvp_send_long(vvp_net_ptr_t ptr, long val); extern void vvp_send_long(vvp_net_ptr_t ptr, long val);
/* /*
* Part-vector versions of above functions. * Part-vector versions of above functions. This function uses the
* corresponding recv_vec4_pv method in the vvp_net_fun_t functor to
* deliver parts of a vector.
*
* The ptr is the destination input port to write to.
*
* <val> is the vector to be written. The width of this vector must
* exactly match the <wid> vector.
*
* The <base> is where in the receiver the bit vector is to be
* written. This address is given in cannonical units; 0 is the LSB, 1
* is the next bit, and so on.
*
* The <vwid> is the width of the destination vector that this part is
* part of. This is used by intermediate nodes, i.e. resolvers, to
* know how wide to pad with Z, if it needs to transform the part to a
* mirror of the destination vector.
*/ */
extern void vvp_send_vec4_pv(vvp_net_ptr_t ptr, vvp_vector4_t val, extern void vvp_send_vec4_pv(vvp_net_ptr_t ptr, vvp_vector4_t val,
unsigned base, unsigned wid, unsigned vwid); unsigned base, unsigned wid, unsigned vwid);
@ -548,6 +564,10 @@ class vvp_fun_signal : public vvp_net_fun_t {
void recv_vec8(vvp_net_ptr_t port, vvp_vector8_t bit); void recv_vec8(vvp_net_ptr_t port, vvp_vector8_t bit);
void recv_long(vvp_net_ptr_t port, long bit); void recv_long(vvp_net_ptr_t port, long bit);
// Part select variants of above
void recv_vec4_pv(vvp_net_ptr_t port, vvp_vector4_t bit,
unsigned base, unsigned wid, unsigned vwid);
// Get information about the vector value. // Get information about the vector value.
unsigned size() const; unsigned size() const;
vvp_bit4_t value(unsigned idx) const; vvp_bit4_t value(unsigned idx) const;
@ -575,6 +595,11 @@ class vvp_fun_signal : public vvp_net_fun_t {
/* /*
* $Log: vvp_net.h,v $ * $Log: vvp_net.h,v $
* Revision 1.17 2005/02/14 01:50:23 steve
* Signals may receive part vectors from %set/x0
* instructions. Re-implement the %set/x0 to do
* just that. Remove the useless %set/x0/x instruction.
*
* Revision 1.16 2005/02/13 05:26:30 steve * Revision 1.16 2005/02/13 05:26:30 steve
* tri0 and tri1 resolvers must replace HiZ with 0/1 after resolution. * tri0 and tri1 resolvers must replace HiZ with 0/1 after resolution.
* *