%set/x0 instruction to support bounds checking.
This commit is contained in:
parent
00b2d467e4
commit
03afbf157b
|
|
@ -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_process.c,v 1.75 2002/11/17 18:31:09 steve Exp $"
|
#ident "$Id: vvp_process.c,v 1.76 2002/11/21 22:43:13 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "vvp_priv.h"
|
# include "vvp_priv.h"
|
||||||
|
|
@ -79,8 +79,8 @@ static void set_to_lvariable(ivl_lval_t lval, unsigned idx,
|
||||||
|
|
||||||
if (ivl_lval_mux(lval)) {
|
if (ivl_lval_mux(lval)) {
|
||||||
assert(wid == 1);
|
assert(wid == 1);
|
||||||
fprintf(vvp_out, " %%set/x V_%s, %u, 0;\n",
|
fprintf(vvp_out, " %%set/x0 V_%s, %u, %u;\n",
|
||||||
vvp_signal_label(sig), bit);
|
vvp_signal_label(sig), bit, ivl_signal_pins(sig)-1);
|
||||||
} else if (wid == 1) {
|
} else if (wid == 1) {
|
||||||
fprintf(vvp_out, " %%set V_%s[%u], %u;\n",
|
fprintf(vvp_out, " %%set V_%s[%u], %u;\n",
|
||||||
vvp_signal_label(sig), idx+part_off, bit);
|
vvp_signal_label(sig), idx+part_off, bit);
|
||||||
|
|
@ -191,6 +191,8 @@ static int show_stmt_assign(ivl_statement_t net)
|
||||||
value and write it into index0. */
|
value and write it into index0. */
|
||||||
if (ivl_lval_mux(lval)) {
|
if (ivl_lval_mux(lval)) {
|
||||||
calculate_into_x0(ivl_lval_mux(lval));
|
calculate_into_x0(ivl_lval_mux(lval));
|
||||||
|
/* Generate code to skip around the set
|
||||||
|
if the index has X values. */
|
||||||
fprintf(vvp_out, " %%jmp/1 t_%u, 4;\n", skip_set);
|
fprintf(vvp_out, " %%jmp/1 t_%u, 4;\n", skip_set);
|
||||||
skip_set_flag = 1;
|
skip_set_flag = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -198,6 +200,8 @@ static int show_stmt_assign(ivl_statement_t net)
|
||||||
mem = ivl_lval_mem(lval);
|
mem = ivl_lval_mem(lval);
|
||||||
if (mem) {
|
if (mem) {
|
||||||
draw_memory_index_expr(mem, ivl_lval_idx(lval));
|
draw_memory_index_expr(mem, ivl_lval_idx(lval));
|
||||||
|
/* Generate code to skip around the set
|
||||||
|
if the index has X values. */
|
||||||
fprintf(vvp_out, " %%jmp/1 t_%u, 4;\n", skip_set);
|
fprintf(vvp_out, " %%jmp/1 t_%u, 4;\n", skip_set);
|
||||||
skip_set_flag = 1;
|
skip_set_flag = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -234,14 +238,7 @@ static int show_stmt_assign(ivl_statement_t net)
|
||||||
idx += cnt;
|
idx += cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
for (idx = 0 ; idx < bit_limit ; idx += 1) {
|
|
||||||
set_to_lvariable(lval, idx,
|
|
||||||
bitchar_to_idx(bits[cur_rbit]), 1);
|
|
||||||
|
|
||||||
cur_rbit += 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (bit_limit < ivl_lval_pins(lval)) {
|
if (bit_limit < ivl_lval_pins(lval)) {
|
||||||
unsigned cnt = ivl_lval_pins(lval) - bit_limit;
|
unsigned cnt = ivl_lval_pins(lval) - bit_limit;
|
||||||
set_to_lvariable(lval, bit_limit, 0, cnt);
|
set_to_lvariable(lval, bit_limit, 0, cnt);
|
||||||
|
|
@ -1452,6 +1449,9 @@ int draw_func_definition(ivl_scope_t scope)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vvp_process.c,v $
|
* $Log: vvp_process.c,v $
|
||||||
|
* Revision 1.76 2002/11/21 22:43:13 steve
|
||||||
|
* %set/x0 instruction to support bounds checking.
|
||||||
|
*
|
||||||
* Revision 1.75 2002/11/17 18:31:09 steve
|
* Revision 1.75 2002/11/17 18:31:09 steve
|
||||||
* Generate unique labels for force functors.
|
* Generate unique labels for force functors.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,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: codes.h,v 1.53 2002/11/08 04:59:57 steve Exp $"
|
#ident "$Id: codes.h,v 1.54 2002/11/21 22:43:13 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -92,7 +92,7 @@ extern bool of_RELEASE(vthread_t thr, vvp_code_t code);
|
||||||
extern bool of_SET(vthread_t thr, vvp_code_t code);
|
extern bool of_SET(vthread_t thr, vvp_code_t code);
|
||||||
extern bool of_SET_MEM(vthread_t thr, vvp_code_t code);
|
extern bool of_SET_MEM(vthread_t thr, vvp_code_t code);
|
||||||
extern bool of_SET_VEC(vthread_t thr, vvp_code_t code);
|
extern bool of_SET_VEC(vthread_t thr, vvp_code_t code);
|
||||||
extern bool of_SET_X(vthread_t thr, vvp_code_t code);
|
extern bool of_SET_X0(vthread_t thr, vvp_code_t code);
|
||||||
extern bool of_SHIFTL_I0(vthread_t thr, vvp_code_t code);
|
extern bool of_SHIFTL_I0(vthread_t thr, vvp_code_t code);
|
||||||
extern bool of_SHIFTR_I0(vthread_t thr, vvp_code_t code);
|
extern bool of_SHIFTR_I0(vthread_t thr, vvp_code_t code);
|
||||||
extern bool of_SUB(vthread_t thr, vvp_code_t code);
|
extern bool of_SUB(vthread_t thr, vvp_code_t code);
|
||||||
|
|
@ -160,6 +160,9 @@ extern vvp_code_t codespace_index(vvp_cpoint_t ptr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: codes.h,v $
|
* $Log: codes.h,v $
|
||||||
|
* Revision 1.54 2002/11/21 22:43:13 steve
|
||||||
|
* %set/x0 instruction to support bounds checking.
|
||||||
|
*
|
||||||
* Revision 1.53 2002/11/08 04:59:57 steve
|
* Revision 1.53 2002/11/08 04:59:57 steve
|
||||||
* Add the %assign/v0 instruction.
|
* Add the %assign/v0 instruction.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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.145 2002/11/08 04:59:58 steve Exp $"
|
#ident "$Id: compile.cc,v 1.146 2002/11/21 22:43:13 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "arith.h"
|
# include "arith.h"
|
||||||
|
|
@ -137,7 +137,7 @@ const static struct opcode_table_s opcode_table[] = {
|
||||||
{ "%set", of_SET, 2, {OA_FUNC_PTR, OA_BIT1, OA_NONE} },
|
{ "%set", of_SET, 2, {OA_FUNC_PTR, OA_BIT1, OA_NONE} },
|
||||||
{ "%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/x", of_SET_X, 3, {OA_FUNC_PTR, OA_BIT1, OA_BIT2} },
|
{ "%set/x0", of_SET_X0, 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} },
|
||||||
{ "%sub", of_SUB, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
|
{ "%sub", of_SUB, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
|
||||||
|
|
@ -1483,6 +1483,9 @@ void compile_net(char*label, char*name, int msb, int lsb, bool signed_flag,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.cc,v $
|
* $Log: compile.cc,v $
|
||||||
|
* Revision 1.146 2002/11/21 22:43:13 steve
|
||||||
|
* %set/x0 instruction to support bounds checking.
|
||||||
|
*
|
||||||
* Revision 1.145 2002/11/08 04:59:58 steve
|
* Revision 1.145 2002/11/08 04:59:58 steve
|
||||||
* Add the %assign/v0 instruction.
|
* Add the %assign/v0 instruction.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* $Id: opcodes.txt,v 1.44 2002/11/08 04:59:58 steve Exp $
|
* $Id: opcodes.txt,v 1.45 2002/11/21 22:43:13 steve Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -459,15 +459,17 @@ address zero is the LSB of the first memory word. This instruction
|
||||||
sets only a single bit.
|
sets only a single bit.
|
||||||
|
|
||||||
|
|
||||||
* %set/x <var-label>, <bit>, <idx>
|
* %set/x0 <var-label>, <bit>, <top>
|
||||||
|
|
||||||
This sets the bit of a variable functor, the address calculated by
|
This sets the bit of a variable functor, the address calculated by
|
||||||
using the index register <idx> (0, 1, 2 or 3) to index the functor
|
using the index register 0 to index the functor address of
|
||||||
address of <var-label>.
|
<var-label>.
|
||||||
|
|
||||||
If the index value in index register <idx> is <0 (for example if
|
If the index value in index register is <0 (for example if %ix/get
|
||||||
%ix/get converted an unknown value into the register) then the set is
|
converted an unknown value into the register) then the set is not
|
||||||
not performed.
|
performed. Also, if the index value is > the immediate top value, then
|
||||||
|
the set is not performed. The 0 and <top> values suffice to provide
|
||||||
|
complete bounds checking.
|
||||||
|
|
||||||
|
|
||||||
* %shiftl/i0 <bit>, <wid>
|
* %shiftl/i0 <bit>, <wid>
|
||||||
|
|
|
||||||
|
|
@ -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.93 2002/11/08 04:59:58 steve Exp $"
|
#ident "$Id: vthread.cc,v 1.94 2002/11/21 22:43:14 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "vthread.h"
|
# include "vthread.h"
|
||||||
|
|
@ -2191,17 +2191,19 @@ bool of_SET_VEC(vthread_t thr, vvp_code_t cp)
|
||||||
* 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 <0.
|
||||||
*/
|
*/
|
||||||
bool of_SET_X(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]);
|
unsigned char bit_val = thr_get_bit(thr, cp->bit_idx[0]);
|
||||||
long idx = thr->index[cp->bit_idx[1]&3];
|
long idx = thr->index[0];
|
||||||
|
|
||||||
/* 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;
|
||||||
|
|
||||||
|
if (idx > cp->bit_idx[1])
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
/* Form the functor pointer from the base pointer and the
|
/* Form the functor pointer from the base pointer and the
|
||||||
index from the index register. */
|
index from the index register. */
|
||||||
|
|
@ -2492,6 +2494,9 @@ bool of_CALL_UFUNC(vthread_t thr, vvp_code_t cp)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vthread.cc,v $
|
* $Log: vthread.cc,v $
|
||||||
|
* Revision 1.94 2002/11/21 22:43:14 steve
|
||||||
|
* %set/x0 instruction to support bounds checking.
|
||||||
|
*
|
||||||
* Revision 1.93 2002/11/08 04:59:58 steve
|
* Revision 1.93 2002/11/08 04:59:58 steve
|
||||||
* Add the %assign/v0 instruction.
|
* Add the %assign/v0 instruction.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue