Add to the debugger the ability to view and
break on functors. Add strengths to functors at compile time, and Make functors pass their strengths as they propagate their output.
This commit is contained in:
parent
4325b787c0
commit
2e12635494
164
vvp/compile.cc
164
vvp/compile.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: compile.cc,v 1.57 2001/05/06 17:42:22 steve Exp $"
|
||||
#ident "$Id: compile.cc,v 1.58 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "compile.h"
|
||||
|
|
@ -300,7 +300,12 @@ void compile_functor(char*label, char*type, unsigned argc, struct symb_s*argv)
|
|||
|
||||
obj->ival = 0x33;
|
||||
obj->oval = 2;
|
||||
obj->odrive0 = 6;
|
||||
obj->odrive1 = 6;
|
||||
obj->mode = 0;
|
||||
#if defined(WIDH_DEBUG)
|
||||
obj->breakpoint = 0;
|
||||
#endif
|
||||
|
||||
if (strcmp(type, "OR") == 0) {
|
||||
obj->table = ft_OR;
|
||||
|
|
@ -406,6 +411,9 @@ void compile_udp_functor(char*label, char*type,
|
|||
iobj->old_ival = obj->ival;
|
||||
iobj->oval = u->init;
|
||||
iobj->mode = M42;
|
||||
#if defined(WITH_DEBUG)
|
||||
iobj->breakpoint = 0;
|
||||
#endif
|
||||
if (idx)
|
||||
{
|
||||
iobj->out = fdx;
|
||||
|
|
@ -498,8 +506,13 @@ void compile_event(char*label, char*type,
|
|||
|
||||
obj->ival = 0xaa;
|
||||
obj->oval = 2;
|
||||
obj->odrive0 = 6;
|
||||
obj->odrive0 = 6;
|
||||
obj->mode = 1;
|
||||
obj->out = 0;
|
||||
#if defined(WITH_DEBUG)
|
||||
obj->breakpoint = 0;
|
||||
#endif
|
||||
|
||||
obj->event = (struct vvp_event_s*) malloc(sizeof (struct vvp_event_s));
|
||||
obj->event->threads = 0;
|
||||
|
|
@ -527,8 +540,13 @@ void compile_named_event(char*label, char*name)
|
|||
|
||||
obj->ival = 0xaa;
|
||||
obj->oval = 2;
|
||||
obj->odrive0 = 6;
|
||||
obj->odrive1 = 6;
|
||||
obj->mode = 2;
|
||||
obj->out = 0;
|
||||
#if defined(WITH_DEBUG)
|
||||
obj->breakpoint = 0;
|
||||
#endif
|
||||
|
||||
obj->event = (struct vvp_event_s*) malloc(sizeof (struct vvp_event_s));
|
||||
obj->event->threads = 0;
|
||||
|
|
@ -547,8 +565,13 @@ void compile_event_or(char*label, unsigned argc, struct symb_s*argv)
|
|||
|
||||
obj->ival = 0xaa;
|
||||
obj->oval = 2;
|
||||
obj->odrive0 = 6;
|
||||
obj->odrive1 = 6;
|
||||
obj->mode = 2;
|
||||
obj->out = 0;
|
||||
#if defined(WITH_DEBUG)
|
||||
obj->breakpoint = 0;
|
||||
#endif
|
||||
|
||||
obj->event = new struct vvp_event_s;
|
||||
obj->event->threads = 0;
|
||||
|
|
@ -872,7 +895,12 @@ void compile_variable(char*label, char*name, int msb, int lsb,
|
|||
obj->table = ft_var;
|
||||
obj->ival = 0x22;
|
||||
obj->oval = 0x02;
|
||||
obj->odrive0 = 6;
|
||||
obj->odrive1 = 6;
|
||||
obj->mode = 0;
|
||||
#if defined(WITH_DEBUG)
|
||||
obj->breakpoint = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Make the vpiHandle for the reg. */
|
||||
|
|
@ -894,9 +922,14 @@ void compile_net(char*label, char*name, int msb, int lsb, bool signed_flag,
|
|||
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
||||
functor_t obj = functor_index(ipoint_index(fdx,idx));
|
||||
obj->table = ft_var;
|
||||
obj->ival = 0x22;
|
||||
obj->ival = 0x02;
|
||||
obj->oval = 0x02;
|
||||
obj->odrive0 = 6;
|
||||
obj->odrive1 = 6;
|
||||
obj->mode = 0;
|
||||
#if defined(WITH_DEBUG)
|
||||
obj->breakpoint = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
assert(argc == wid);
|
||||
|
|
@ -1047,8 +1080,30 @@ void compile_dump(FILE*fd)
|
|||
codespace_dump(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
* These functions are in support of the debugger.
|
||||
*
|
||||
* debug_lookup_functor
|
||||
* Use a name to locate a functor address. This only gets the LSB
|
||||
* of a vector, but it is enough to locate the object.
|
||||
*/
|
||||
vvp_ipoint_t debug_lookup_functor(const char*name)
|
||||
{
|
||||
symbol_value_t val = sym_get_value(sym_functors, name);
|
||||
return val.num;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* $Log: compile.cc,v $
|
||||
* Revision 1.58 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.57 2001/05/06 17:42:22 steve
|
||||
* Add the %ix/get instruction. (Stephan Boettcher)
|
||||
*
|
||||
|
|
@ -1084,110 +1139,5 @@ void compile_dump(FILE*fd)
|
|||
*
|
||||
* Revision 1.48 2001/05/01 01:09:39 steve
|
||||
* Add support for memory objects. (Stephan Boettcher)
|
||||
*
|
||||
* Revision 1.47 2001/04/30 03:53:19 steve
|
||||
* Fix up functor inputs to support C<?> values.
|
||||
*
|
||||
* Revision 1.46 2001/04/29 23:13:33 steve
|
||||
* Add bufif0 and bufif1 functors.
|
||||
*
|
||||
* Revision 1.45 2001/04/29 22:59:46 steve
|
||||
* Support .net constant inputs.
|
||||
*
|
||||
* Revision 1.44 2001/04/28 20:24:03 steve
|
||||
* input connect cleanup. (Stephan Boettcher)
|
||||
*
|
||||
* Revision 1.43 2001/04/26 15:52:22 steve
|
||||
* Add the mode-42 functor concept to UDPs.
|
||||
*
|
||||
* Revision 1.42 2001/04/26 05:12:02 steve
|
||||
* Implement simple MUXZ for ?: operators.
|
||||
*
|
||||
* Revision 1.41 2001/04/26 03:10:55 steve
|
||||
* Redo and simplify UDP behavior.
|
||||
*
|
||||
* Revision 1.40 2001/04/24 03:48:53 steve
|
||||
* Fix underflow when UDP has 1 input.
|
||||
*
|
||||
* Revision 1.39 2001/04/24 02:23:59 steve
|
||||
* Support for UDP devices in VVP (Stephen Boettcher)
|
||||
*
|
||||
* Revision 1.38 2001/04/23 00:37:58 steve
|
||||
* Support unconnected .net objects.
|
||||
*
|
||||
* Revision 1.37 2001/04/21 02:04:01 steve
|
||||
* Add NAND and XNOR functors.
|
||||
*
|
||||
* Revision 1.36 2001/04/18 05:03:49 steve
|
||||
* Resolve forward references for %fork.
|
||||
*
|
||||
* Revision 1.35 2001/04/18 04:21:23 steve
|
||||
* Put threads into scopes.
|
||||
*
|
||||
* Revision 1.34 2001/04/15 16:37:48 steve
|
||||
* add XOR support.
|
||||
*
|
||||
* Revision 1.33 2001/04/15 04:07:56 steve
|
||||
* Add support for behavioral xnor.
|
||||
*
|
||||
* Revision 1.32 2001/04/14 05:10:56 steve
|
||||
* support the .event/or statement.
|
||||
*
|
||||
* Revision 1.31 2001/04/13 03:55:18 steve
|
||||
* More complete reap of all threads.
|
||||
*
|
||||
* Revision 1.30 2001/04/05 01:34:26 steve
|
||||
* Add the .var/s and .net/s statements for VPI support.
|
||||
*
|
||||
* Revision 1.29 2001/04/05 01:12:28 steve
|
||||
* Get signed compares working correctly in vvp.
|
||||
*
|
||||
* Revision 1.28 2001/04/01 22:25:33 steve
|
||||
* Add the reduction nor instruction.
|
||||
*
|
||||
* Revision 1.27 2001/04/01 21:31:46 steve
|
||||
* Add the buf functor type.
|
||||
*
|
||||
* Revision 1.26 2001/04/01 07:22:08 steve
|
||||
* Implement the less-then and %or instructions.
|
||||
*
|
||||
* Revision 1.25 2001/04/01 06:40:45 steve
|
||||
* Support empty statements for hanging labels.
|
||||
*
|
||||
* Revision 1.24 2001/04/01 06:12:13 steve
|
||||
* Add the bitwise %and instruction.
|
||||
*
|
||||
* Revision 1.23 2001/04/01 04:34:28 steve
|
||||
* Implement %cmp/x and %cmp/z instructions.
|
||||
*
|
||||
* Revision 1.22 2001/03/31 19:00:43 steve
|
||||
* Add VPI support for the simulation time.
|
||||
*
|
||||
* Revision 1.21 2001/03/31 17:36:02 steve
|
||||
* Add the jmp/1 instruction.
|
||||
*
|
||||
* Revision 1.20 2001/03/31 01:59:59 steve
|
||||
* Add the ADD instrunction.
|
||||
*
|
||||
* Revision 1.19 2001/03/30 04:55:22 steve
|
||||
* Add fork and join instructions.
|
||||
*
|
||||
* Revision 1.18 2001/03/29 03:46:36 steve
|
||||
* Support named events as mode 2 functors.
|
||||
*
|
||||
* Revision 1.17 2001/03/28 17:24:32 steve
|
||||
* include string.h for strcmp et al.
|
||||
*
|
||||
* Revision 1.16 2001/03/26 04:00:39 steve
|
||||
* Add the .event statement and the %wait instruction.
|
||||
*
|
||||
* Revision 1.15 2001/03/25 19:38:23 steve
|
||||
* Support NOR and NOT gates.
|
||||
*
|
||||
* Revision 1.14 2001/03/25 03:54:26 steve
|
||||
* Add JMP0XZ and postpone net inputs when needed.
|
||||
*
|
||||
* Revision 1.13 2001/03/25 00:35:35 steve
|
||||
* Add the .net statement.
|
||||
*/
|
||||
|
||||
|
|
|
|||
81
vvp/debug.cc
81
vvp/debug.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: debug.cc,v 1.1 2001/05/05 23:55:46 steve Exp $"
|
||||
#ident "$Id: debug.cc,v 1.2 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -31,16 +31,78 @@
|
|||
#if defined(WITH_DEBUG)
|
||||
|
||||
# include "debug.h"
|
||||
# include "functor.h"
|
||||
# include "schedule.h"
|
||||
# include <stdio.h>
|
||||
# include <readline/readline.h>
|
||||
# include <readline/history.h>
|
||||
# include <string.h>
|
||||
# include <stdlib.h>
|
||||
# include <malloc.h>
|
||||
|
||||
|
||||
static bool interact_flag = false;
|
||||
|
||||
extern vvp_ipoint_t debug_lookup_functor(const char*name);
|
||||
|
||||
static void cmd_lookup(unsigned argc, char*argv[])
|
||||
{
|
||||
for (unsigned idx = 1 ; idx < argc ; idx += 1) {
|
||||
vvp_ipoint_t fnc = debug_lookup_functor(argv[idx]);
|
||||
|
||||
if (fnc) {
|
||||
printf("%s: functor 0x%x\n", argv[idx], fnc);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("%s: *** unknown\n", argv[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
static void cmd_fbreak(unsigned argc, char*argv[])
|
||||
{
|
||||
for (unsigned idx = 1 ; idx < argc ; idx += 1) {
|
||||
vvp_ipoint_t fnc = strtoul(argv[idx],0,0);
|
||||
functor_t fp = functor_index(fnc);
|
||||
|
||||
if (fp == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fp->breakpoint = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static const char bitval_tab[4] = { '0', '1', 'x', 'z' };
|
||||
static const char*strength_tab[8] = {
|
||||
"hiz", "small",
|
||||
"medium", "weak",
|
||||
"large", "pull",
|
||||
"strong", "supply" };
|
||||
|
||||
static void cmd_functor(unsigned argc, char*argv[])
|
||||
{
|
||||
for (unsigned idx = 1 ; idx < argc ; idx += 1) {
|
||||
vvp_ipoint_t fnc = strtoul(argv[idx],0,0);
|
||||
functor_t fp = functor_index(fnc);
|
||||
|
||||
if (fp == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("out pointer = 0x%x\n", fp->out);
|
||||
printf("input values = %c %c %c %c\n",
|
||||
bitval_tab[fp->ival&3],
|
||||
bitval_tab[(fp->ival>>2)&3],
|
||||
bitval_tab[(fp->ival>>4)&3],
|
||||
bitval_tab[(fp->ival>>6)&3]);
|
||||
printf("out value = %c (%s0 %s1)\n",
|
||||
bitval_tab[fp->oval],
|
||||
strength_tab[fp->odrive0],
|
||||
strength_tab[fp->odrive1]);
|
||||
}
|
||||
}
|
||||
|
||||
static void cmd_go(unsigned, char*[])
|
||||
{
|
||||
interact_flag = false;
|
||||
|
|
@ -60,9 +122,12 @@ static void cmd_unknown(unsigned argc, char*argv[])
|
|||
struct {
|
||||
const char*name; void (*proc)(unsigned argc, char*argv[]);
|
||||
} cmd_table[] = {
|
||||
{ "go", &cmd_go},
|
||||
{ "time", &cmd_time},
|
||||
{ 0, &cmd_unknown}
|
||||
{ "fbreak", &cmd_fbreak},
|
||||
{ "func", &cmd_functor},
|
||||
{ "go", &cmd_go},
|
||||
{ "lookup", &cmd_lookup},
|
||||
{ "time", &cmd_time},
|
||||
{ 0, &cmd_unknown}
|
||||
};
|
||||
|
||||
void breakpoint(void)
|
||||
|
|
@ -104,6 +169,14 @@ void breakpoint(void)
|
|||
#endif
|
||||
/*
|
||||
* $Log: debug.cc,v $
|
||||
* Revision 1.2 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.1 2001/05/05 23:55:46 steve
|
||||
* Add the beginnings of an interactive debugger.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
INTERACTIVE ASSEMBLY DEBUGGER
|
||||
|
||||
The VVP runtime includes an interactive runtime debugger that allows
|
||||
the expert user to trace the actions of the VVP simulation. It is
|
||||
entered just before simulation starts if the user uses the -d flag to
|
||||
the vvp command, and it is also entered when an interesting breakpoint
|
||||
is triggered. The -d flag is useful for giving the user a chance to
|
||||
set breakpoints.
|
||||
|
||||
DEBUGGER COMMANDS
|
||||
|
||||
* go
|
||||
|
||||
Resume the simulation. The simulation will continue until the next
|
||||
breakpoint, or until the simulation ends.
|
||||
|
||||
* lookup <symbol>...
|
||||
|
||||
Give a symbol name, and this function will lookup that symbol and
|
||||
return the type and address.
|
||||
|
||||
fbreak <address>...
|
||||
|
||||
Set the breakpoint on a given functor address. (Use the lookup
|
||||
function to locate the address.)
|
||||
|
|
@ -17,13 +17,14 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: functor.cc,v 1.16 2001/05/06 03:51:37 steve Exp $"
|
||||
#ident "$Id: functor.cc,v 1.17 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "functor.h"
|
||||
# include "udp.h"
|
||||
# include "schedule.h"
|
||||
# include "vthread.h"
|
||||
# include "debug.h"
|
||||
# include <assert.h>
|
||||
|
||||
/*
|
||||
|
|
@ -233,17 +234,21 @@ static void functor_set_mode2(functor_t fp)
|
|||
* output. If the output changes any, then generate the necessary
|
||||
* propagation events to pass the output on.
|
||||
*/
|
||||
void functor_set(vvp_ipoint_t ptr, unsigned bit, bool push)
|
||||
void functor_set(vvp_ipoint_t ptr, unsigned bit,
|
||||
unsigned drive0, unsigned drive1,
|
||||
bool push)
|
||||
{
|
||||
functor_t fp = functor_index(ptr);
|
||||
unsigned pp = ipoint_port(ptr);
|
||||
assert(fp);
|
||||
// assert(fp->table);
|
||||
|
||||
assert(drive0 <= 8);
|
||||
assert(drive1 <= 8);
|
||||
|
||||
/* Change the bits of the input. */
|
||||
static const unsigned char mask_table[4] = { 0xfc, 0xf3, 0xcf, 0x3f };
|
||||
unsigned char mask = mask_table[pp];
|
||||
fp->ival = (fp->ival & mask) | (bit << (2*pp));
|
||||
fp->ival = (fp->ival & mask) | ((bit & 3) << (2*pp));
|
||||
|
||||
switch (fp->mode) {
|
||||
case 0:
|
||||
|
|
@ -264,6 +269,11 @@ void functor_set(vvp_ipoint_t ptr, unsigned bit, bool push)
|
|||
fp->obj->set(ptr, fp, push);
|
||||
break;
|
||||
}
|
||||
|
||||
#if defined(WITH_DEBUG)
|
||||
if (fp->breakpoint)
|
||||
breakpoint();
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned functor_get(vvp_ipoint_t ptr)
|
||||
|
|
@ -272,7 +282,7 @@ unsigned functor_get(vvp_ipoint_t ptr)
|
|||
assert(fp);
|
||||
if ((fp->mode == M42) && fp->obj)
|
||||
return fp->obj->get(ptr, fp);
|
||||
return fp->oval & 3;
|
||||
return fp->oval;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -285,12 +295,14 @@ void functor_propagate(vvp_ipoint_t ptr)
|
|||
{
|
||||
functor_t fp = functor_index(ptr);
|
||||
unsigned char oval = fp->oval;
|
||||
unsigned drive0 = fp->odrive0;
|
||||
unsigned drive1 = fp->odrive1;
|
||||
|
||||
vvp_ipoint_t idx = fp->out;
|
||||
while (idx) {
|
||||
functor_t idxp = functor_index(idx);
|
||||
vvp_ipoint_t next = idxp->port[ipoint_port(idx)];
|
||||
functor_set(idx, oval);
|
||||
functor_set(idx, oval, drive0, drive1);
|
||||
idx = next;
|
||||
}
|
||||
}
|
||||
|
|
@ -331,6 +343,14 @@ const unsigned char ft_var[16] = {
|
|||
|
||||
/*
|
||||
* $Log: functor.cc,v $
|
||||
* Revision 1.17 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.16 2001/05/06 03:51:37 steve
|
||||
* Regularize the mode-42 functor handling.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: functor.h,v 1.18 2001/05/06 03:51:37 steve Exp $"
|
||||
#ident "$Id: functor.h,v 1.19 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "pointers.h"
|
||||
|
|
@ -83,6 +83,25 @@
|
|||
* with a struct vvp_fobj_s pointer. This abstract class has virtual
|
||||
* methods for receiving and retrieving values. See the vvp_fobj_s
|
||||
* definition below.
|
||||
*
|
||||
* STRENGTHS:
|
||||
*
|
||||
* The normal functor (modes 0, 1 and 2) is not aware of strengths. It
|
||||
* generates strength simply by virtue of having strength
|
||||
* specifications.
|
||||
*
|
||||
* When the bit value is read out of the functor, only the val bits
|
||||
* are read. There are 8 drive values available in the 3 bits:
|
||||
* HiZ = 0,
|
||||
* SMALL = 1,
|
||||
* MEDIUM = 2,
|
||||
* WEAK = 3,
|
||||
* LARGE = 4,
|
||||
* PULL = 5,
|
||||
* STRONG = 6,
|
||||
* SUPPLY = 7
|
||||
*
|
||||
* Only mode-42 functors are strength-aware.
|
||||
*/
|
||||
|
||||
struct functor_s {
|
||||
|
|
@ -99,7 +118,15 @@ struct functor_s {
|
|||
vvp_ipoint_t port[4];
|
||||
/* These are the input values. */
|
||||
unsigned char ival;
|
||||
unsigned char oval;
|
||||
/* Output value (low bits, and drive1 and drive0 strength. */
|
||||
unsigned oval : 2;
|
||||
unsigned odrive0 : 3;
|
||||
unsigned odrive1 : 3;
|
||||
#if defined(WITH_DEBUG)
|
||||
/* True if this functor triggers a breakpoint. */
|
||||
unsigned breakpoint : 1;
|
||||
#endif
|
||||
|
||||
/* functor mode: 0 == table ; 1 == event ; 2 == named event */
|
||||
unsigned char mode;
|
||||
union {
|
||||
|
|
@ -171,10 +198,21 @@ extern vvp_ipoint_t functor_allocate(unsigned wid);
|
|||
/*
|
||||
* functor_set sets the addressed input to the specified value, and
|
||||
* calculates a new output value. If there is any propagation to do,
|
||||
* propagation events are created.
|
||||
* propagation events are created. Propagation calls further
|
||||
* functor_set methods for the functors connected to the output.
|
||||
*
|
||||
* The val contains 2 bits two represent the 4-value bit. The drive0
|
||||
* and drive1 values are also passed, and typically just stored in the
|
||||
* functor.
|
||||
*/
|
||||
extern void functor_set(vvp_ipoint_t point, unsigned val, bool push=false);
|
||||
extern void functor_set(vvp_ipoint_t point, unsigned val,
|
||||
unsigned drive0, unsigned drive1,
|
||||
bool push=false);
|
||||
|
||||
/*
|
||||
* Read the value of the functor. In fact, only the *value* is read --
|
||||
* the strength of that value is stripped off.
|
||||
*/
|
||||
extern unsigned functor_get(vvp_ipoint_t ptr);
|
||||
|
||||
/*
|
||||
|
|
@ -222,6 +260,14 @@ extern const unsigned char ft_var[];
|
|||
|
||||
/*
|
||||
* $Log: functor.h,v $
|
||||
* Revision 1.19 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.18 2001/05/06 03:51:37 steve
|
||||
* Regularize the mode-42 functor handling.
|
||||
*
|
||||
|
|
|
|||
20
vvp/main.cc
20
vvp/main.cc
|
|
@ -17,10 +17,11 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: main.cc,v 1.8 2001/04/04 04:33:08 steve Exp $"
|
||||
#ident "$Id: main.cc,v 1.9 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
# include "debug.h"
|
||||
# include "parse_misc.h"
|
||||
# include "compile.h"
|
||||
# include "schedule.h"
|
||||
|
|
@ -41,8 +42,12 @@ int main(int argc, char*argv[])
|
|||
unsigned flag_errors = 0;
|
||||
const char*dump_path = 0;
|
||||
const char*design_path = 0;
|
||||
bool debug_flag = false;
|
||||
|
||||
while ((opt = getopt(argc, argv, "D:M:m:")) != EOF) switch (opt) {
|
||||
while ((opt = getopt(argc, argv, "D:dM:m:")) != EOF) switch (opt) {
|
||||
case 'd':
|
||||
debug_flag = true;
|
||||
break;
|
||||
case 'D':
|
||||
dump_path = optarg;
|
||||
break;
|
||||
|
|
@ -93,6 +98,9 @@ int main(int argc, char*argv[])
|
|||
return compile_errors;
|
||||
}
|
||||
|
||||
if (debug_flag)
|
||||
breakpoint();
|
||||
|
||||
schedule_simulate();
|
||||
|
||||
return 0;
|
||||
|
|
@ -100,6 +108,14 @@ int main(int argc, char*argv[])
|
|||
|
||||
/*
|
||||
* $Log: main.cc,v $
|
||||
* Revision 1.9 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.8 2001/04/04 04:33:08 steve
|
||||
* Take vector form as parameters to vpi_call.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: schedule.cc,v 1.8 2001/05/05 23:51:49 steve Exp $"
|
||||
#ident "$Id: schedule.cc,v 1.9 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "schedule.h"
|
||||
|
|
@ -255,7 +255,7 @@ void schedule_simulate(void)
|
|||
break;
|
||||
|
||||
case TYPE_ASSIGN:
|
||||
functor_set(cur->fun, cur->val);
|
||||
functor_set(cur->fun, cur->val, 6, 6);
|
||||
break;
|
||||
|
||||
case TYPE_GEN:
|
||||
|
|
@ -271,6 +271,14 @@ void schedule_simulate(void)
|
|||
|
||||
/*
|
||||
* $Log: schedule.cc,v $
|
||||
* Revision 1.9 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.8 2001/05/05 23:51:49 steve
|
||||
* Forward the simulation time for every event.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: vpi_signal.cc,v 1.9 2001/04/26 00:01:33 steve Exp $"
|
||||
#ident "$Id: vpi_signal.cc,v 1.10 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -267,7 +267,8 @@ static vpiHandle signal_put_value(vpiHandle ref, s_vpi_value*vp,
|
|||
|
||||
long val = vp->value.integer;
|
||||
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
||||
functor_set(ipoint_index(rfp->bits,idx), val&1, true);
|
||||
functor_set(ipoint_index(rfp->bits,idx), val&1,
|
||||
6, 6, true);
|
||||
val >>= 1;
|
||||
}
|
||||
break;
|
||||
|
|
@ -276,16 +277,16 @@ static vpiHandle signal_put_value(vpiHandle ref, s_vpi_value*vp,
|
|||
case vpiScalarVal:
|
||||
switch (vp->value.scalar) {
|
||||
case vpi0:
|
||||
functor_set(rfp->bits, 0, true);
|
||||
functor_set(rfp->bits, 0, 6, 6, true);
|
||||
break;
|
||||
case vpi1:
|
||||
functor_set(rfp->bits, 1, true);
|
||||
functor_set(rfp->bits, 1, 6, 6, true);
|
||||
break;
|
||||
case vpiX:
|
||||
functor_set(rfp->bits, 2, true);
|
||||
functor_set(rfp->bits, 2, 6, 6, true);
|
||||
break;
|
||||
case vpiZ:
|
||||
functor_set(rfp->bits, 3, true);
|
||||
functor_set(rfp->bits, 3, 6, 6, true);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
|
|
@ -301,16 +302,20 @@ static vpiHandle signal_put_value(vpiHandle ref, s_vpi_value*vp,
|
|||
int bit = (aval&1) | ((bval<<1)&2);
|
||||
switch (bit) {
|
||||
case 0: /* zero */
|
||||
functor_set(ipoint_index(rfp->bits,idx), 0, true);
|
||||
functor_set(ipoint_index(rfp->bits,idx),
|
||||
0, 6, 6, true);
|
||||
break;
|
||||
case 1: /* one */
|
||||
functor_set(ipoint_index(rfp->bits,idx), 1, true);
|
||||
functor_set(ipoint_index(rfp->bits,idx),
|
||||
1, 6, 6, true);
|
||||
break;
|
||||
case 2: /* z */
|
||||
functor_set(ipoint_index(rfp->bits,idx), 3, true);
|
||||
functor_set(ipoint_index(rfp->bits,idx),
|
||||
3, 6, 6, true);
|
||||
break;
|
||||
case 3: /* x */
|
||||
functor_set(ipoint_index(rfp->bits,idx), 2, true);
|
||||
functor_set(ipoint_index(rfp->bits,idx),
|
||||
2, 6, 6, true);
|
||||
break;
|
||||
}
|
||||
aval >>= 1;
|
||||
|
|
@ -394,6 +399,14 @@ vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag,
|
|||
|
||||
/*
|
||||
* $Log: vpi_signal.cc,v $
|
||||
* Revision 1.10 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.9 2001/04/26 00:01:33 steve
|
||||
* Support $deposit to a wire or reg.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: vthread.cc,v 1.36 2001/05/06 17:42:22 steve Exp $"
|
||||
#ident "$Id: vthread.cc,v 1.37 2001/05/08 23:32:26 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vthread.h"
|
||||
|
|
@ -830,7 +830,7 @@ bool of_OR(vthread_t thr, vvp_code_t cp)
|
|||
bool of_SET(vthread_t thr, vvp_code_t cp)
|
||||
{
|
||||
unsigned char bit_val = thr_get_bit(thr, cp->bit_idx1);
|
||||
functor_set(cp->iptr, bit_val, true);
|
||||
functor_set(cp->iptr, bit_val, 6, 6, true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -993,6 +993,14 @@ bool of_ZOMBIE(vthread_t thr, vvp_code_t)
|
|||
|
||||
/*
|
||||
* $Log: vthread.cc,v $
|
||||
* Revision 1.37 2001/05/08 23:32:26 steve
|
||||
* Add to the debugger the ability to view and
|
||||
* break on functors.
|
||||
*
|
||||
* Add strengths to functors at compile time,
|
||||
* and Make functors pass their strengths as they
|
||||
* propagate their output.
|
||||
*
|
||||
* Revision 1.36 2001/05/06 17:42:22 steve
|
||||
* Add the %ix/get instruction. (Stephan Boettcher)
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue