Code rearrange. (Stephan Boettcher)
This commit is contained in:
parent
0c4bea473c
commit
bf9a8f5021
|
|
@ -16,7 +16,7 @@
|
||||||
# 59 Temple Place - Suite 330
|
# 59 Temple Place - Suite 330
|
||||||
# Boston, MA 02111-1307, USA
|
# Boston, MA 02111-1307, USA
|
||||||
#
|
#
|
||||||
#ident "$Id: Makefile.in,v 1.30 2001/11/01 03:00:19 steve Exp $"
|
#ident "$Id: Makefile.in,v 1.31 2001/11/06 03:07:21 steve Exp $"
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
@ -65,7 +65,7 @@ vpi_vthr_vector.o vvp_vpi.o
|
||||||
|
|
||||||
O = main.o parse.o parse_misc.o lexor.o arith.o bufif.o compile.o debug.o \
|
O = main.o parse.o parse_misc.o lexor.o arith.o bufif.o compile.o debug.o \
|
||||||
functor.o fvectors.o npmos.o resolv.o symbols.o codes.o vthread.o schedule.o \
|
functor.o fvectors.o npmos.o resolv.o symbols.o codes.o vthread.o schedule.o \
|
||||||
tables.o udp.o memory.o force.o $V
|
tables.o udp.o memory.o force.o event.o logic.o $V
|
||||||
|
|
||||||
vvp: $O
|
vvp: $O
|
||||||
$(CXX) $(rdynamic) $(CXXFLAGS) $(LDFLAGS) -o vvp $O $(LIBS) $(dllib)
|
$(CXX) $(rdynamic) $(CXXFLAGS) $(LDFLAGS) -o vvp $O $(LIBS) $(dllib)
|
||||||
|
|
|
||||||
150
vvp/compile.cc
150
vvp/compile.cc
|
|
@ -17,12 +17,10 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: compile.cc,v 1.112 2001/11/01 04:42:39 steve Exp $"
|
#ident "$Id: compile.cc,v 1.113 2001/11/06 03:07:21 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "arith.h"
|
# include "arith.h"
|
||||||
# include "bufif.h"
|
|
||||||
# include "npmos.h"
|
|
||||||
# include "compile.h"
|
# include "compile.h"
|
||||||
# include "functor.h"
|
# include "functor.h"
|
||||||
# include "resolv.h"
|
# include "resolv.h"
|
||||||
|
|
@ -33,7 +31,6 @@
|
||||||
# include "codes.h"
|
# include "codes.h"
|
||||||
# include "schedule.h"
|
# include "schedule.h"
|
||||||
# include "vpi_priv.h"
|
# include "vpi_priv.h"
|
||||||
# include "vthread.h"
|
|
||||||
# include "parse_misc.h"
|
# include "parse_misc.h"
|
||||||
#ifdef HAVE_MALLOC_H
|
#ifdef HAVE_MALLOC_H
|
||||||
# include <malloc.h>
|
# include <malloc.h>
|
||||||
|
|
@ -184,7 +181,7 @@ static symbol_table_t sym_vpi = 0;
|
||||||
* Add a functor to the symbol table
|
* Add a functor to the symbol table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void define_functor_symbol(const char*label, vvp_ipoint_t ipt)
|
void define_functor_symbol(const char*label, vvp_ipoint_t ipt)
|
||||||
{
|
{
|
||||||
symbol_value_t val;
|
symbol_value_t val;
|
||||||
val.num = ipt;
|
val.num = ipt;
|
||||||
|
|
@ -518,7 +515,7 @@ void compile_vpi_time_precision(long pre)
|
||||||
* and skip the symbol lookup.
|
* and skip the symbol lookup.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void inputs_connect(vvp_ipoint_t fdx, unsigned argc, struct symb_s*argv)
|
void inputs_connect(vvp_ipoint_t fdx, unsigned argc, struct symb_s*argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
for (unsigned idx = 0; idx < argc; idx += 1) {
|
for (unsigned idx = 0; idx < argc; idx += 1) {
|
||||||
|
|
@ -626,86 +623,6 @@ static void functor_reference(vvp_ipoint_t *ref, char *lab, unsigned idx)
|
||||||
free(lab);
|
free(lab);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The parser calls this function to create a functor. I allocate a
|
|
||||||
* functor, and map the name to the vvp_ipoint_t address for the
|
|
||||||
* functor. Also resolve the inputs to the functor.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void compile_functor(char*label, char*type, unsigned argc, struct symb_s*argv)
|
|
||||||
{
|
|
||||||
functor_t obj;
|
|
||||||
|
|
||||||
if (strcmp(type, "OR") == 0) {
|
|
||||||
obj = new table_functor_s(ft_OR);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "AND") == 0) {
|
|
||||||
obj = new table_functor_s(ft_AND);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "BUF") == 0) {
|
|
||||||
obj = new table_functor_s(ft_BUF);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "BUFIF0") == 0) {
|
|
||||||
obj = new vvp_bufif0_s;
|
|
||||||
|
|
||||||
} else if (strcmp(type, "BUFIF1") == 0) {
|
|
||||||
obj = new vvp_bufif1_s;
|
|
||||||
|
|
||||||
} else if (strcmp(type, "PMOS") == 0) {
|
|
||||||
obj = new vvp_pmos_s;
|
|
||||||
|
|
||||||
} else if (strcmp(type, "NMOS") == 0) {
|
|
||||||
obj= new vvp_nmos_s;
|
|
||||||
|
|
||||||
} else if (strcmp(type, "RPMOS") == 0) {
|
|
||||||
obj = new vvp_rpmos_s;
|
|
||||||
|
|
||||||
} else if (strcmp(type, "RNMOS") == 0) {
|
|
||||||
obj = new vvp_rnmos_s;
|
|
||||||
|
|
||||||
} else if (strcmp(type, "MUXZ") == 0) {
|
|
||||||
obj = new table_functor_s(ft_MUXZ);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "EEQ") == 0) {
|
|
||||||
obj = new table_functor_s(ft_EEQ);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "NAND") == 0) {
|
|
||||||
obj = new table_functor_s(ft_NAND);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "NOR") == 0) {
|
|
||||||
obj = new table_functor_s(ft_NOR);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "NOT") == 0) {
|
|
||||||
obj = new table_functor_s(ft_NOT);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "XNOR") == 0) {
|
|
||||||
obj = new table_functor_s(ft_XNOR);
|
|
||||||
|
|
||||||
} else if (strcmp(type, "XOR") == 0) {
|
|
||||||
obj = new table_functor_s(ft_XOR);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
yyerror("invalid functor type.");
|
|
||||||
free(type);
|
|
||||||
free(argv);
|
|
||||||
free(label);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(type);
|
|
||||||
|
|
||||||
assert(argc <= 4);
|
|
||||||
vvp_ipoint_t fdx = functor_allocate(1);
|
|
||||||
functor_define(fdx, obj);
|
|
||||||
define_functor_symbol(label, fdx);
|
|
||||||
free(label);
|
|
||||||
|
|
||||||
/* Connect the inputs of this functor to the given symbols. If
|
|
||||||
there are C<X> inputs, set the ival appropriately. */
|
|
||||||
inputs_connect(fdx, argc, argv);
|
|
||||||
free(argv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void make_extra_outputs(vvp_ipoint_t fdx, unsigned wid)
|
static void make_extra_outputs(vvp_ipoint_t fdx, unsigned wid)
|
||||||
{
|
{
|
||||||
for (unsigned i=1; i < wid; i++) {
|
for (unsigned i=1; i < wid; i++) {
|
||||||
|
|
@ -1095,64 +1012,6 @@ void compile_memory_init(char *memid, unsigned i, unsigned char val)
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
** Create an event functor
|
|
||||||
** edge: compile_event(label, type, argc, argv)
|
|
||||||
** or: compile_event(label, NULL, argc, argv)
|
|
||||||
** name: compile_event(label, name, NULL, NULL)
|
|
||||||
*/
|
|
||||||
|
|
||||||
void compile_event(char*label, char*type,
|
|
||||||
unsigned argc, struct symb_s*argv)
|
|
||||||
{
|
|
||||||
event_functor_s::edge_t edge = vvp_edge_none;
|
|
||||||
|
|
||||||
if (argc && type) {
|
|
||||||
if (strcmp(type,"posedge") == 0)
|
|
||||||
edge = vvp_edge_posedge;
|
|
||||||
else if (strcmp(type,"negedge") == 0)
|
|
||||||
edge = vvp_edge_negedge;
|
|
||||||
else if (strcmp(type,"edge") == 0)
|
|
||||||
edge = vvp_edge_anyedge;
|
|
||||||
|
|
||||||
assert(argc <= 4 || edge == vvp_edge_none);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!argc && type) {
|
|
||||||
// "type" is the name of the named event
|
|
||||||
}
|
|
||||||
|
|
||||||
free(type);
|
|
||||||
|
|
||||||
functor_t obj = new event_functor_s(edge);
|
|
||||||
|
|
||||||
vvp_ipoint_t fdx = functor_allocate(1);
|
|
||||||
functor_define(fdx, obj);
|
|
||||||
define_functor_symbol(label, fdx);
|
|
||||||
free(label);
|
|
||||||
|
|
||||||
/* Run through the arguments looking for the functors that are
|
|
||||||
connected to my input ports. For each source functor that I
|
|
||||||
find, connect the output of that functor to the indexed
|
|
||||||
input by inserting myself (complete with the port number in
|
|
||||||
the vvp_ipoint_t) into the list that the source heads.
|
|
||||||
|
|
||||||
If the source functor is not declared yet, then don't do
|
|
||||||
the link yet. Save the reference to be resolved later. */
|
|
||||||
|
|
||||||
if (edge != vvp_edge_none)
|
|
||||||
inputs_connect(fdx, argc, argv);
|
|
||||||
else
|
|
||||||
// Are we sure that we have those .event/or
|
|
||||||
// drivers exclusively?
|
|
||||||
for (unsigned i=0; i<argc; i++) {
|
|
||||||
inputs_connect(fdx, 1, argv+i);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(argv);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The parser uses this function to compile and link an executable
|
* The parser uses this function to compile and link an executable
|
||||||
* opcode. I do this by looking up the opcode in the opcode_table. The
|
* opcode. I do this by looking up the opcode in the opcode_table. The
|
||||||
|
|
@ -1482,6 +1341,9 @@ vvp_ipoint_t debug_lookup_functor(const char*name)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.cc,v $
|
* $Log: compile.cc,v $
|
||||||
|
* Revision 1.113 2001/11/06 03:07:21 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
* Revision 1.112 2001/11/01 04:42:39 steve
|
* Revision 1.112 2001/11/01 04:42:39 steve
|
||||||
* Handle procedural constant functor pointers.
|
* Handle procedural constant functor pointers.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: compile.h,v 1.36 2001/11/01 03:00:19 steve Exp $"
|
#ident "$Id: compile.h,v 1.37 2001/11/06 03:07:22 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
@ -39,6 +39,18 @@ extern void compile_init(void);
|
||||||
|
|
||||||
extern void compile_cleanup(void);
|
extern void compile_cleanup(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Connect a list of symbols to a contiguous set of ipoints.
|
||||||
|
* Constants C<?> are handled by setting the ival of the ipoint.
|
||||||
|
*/
|
||||||
|
extern void inputs_connect(vvp_ipoint_t fdx, unsigned argc, struct symb_s*argv);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add a functor to the symbol table
|
||||||
|
*/
|
||||||
|
extern void define_functor_symbol(const char*label, vvp_ipoint_t ipt);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is a count of errors encountered during compilation. If this
|
* This is a count of errors encountered during compilation. If this
|
||||||
* is non-zero, then simulation is not recommended.
|
* is non-zero, then simulation is not recommended.
|
||||||
|
|
@ -208,6 +220,9 @@ extern void compile_net(char*label, char*name,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.h,v $
|
* $Log: compile.h,v $
|
||||||
|
* Revision 1.37 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
* Revision 1.36 2001/11/01 03:00:19 steve
|
* Revision 1.36 2001/11/01 03:00:19 steve
|
||||||
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: draw_tt.c,v 1.10 2001/10/09 02:28:17 steve Exp $"
|
#ident "$Id: draw_tt.c,v 1.11 2001/11/06 03:07:22 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
@ -594,7 +594,7 @@ static void draw_oct_table()
|
||||||
|
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
printf("# include \"functor.h\"\n");
|
printf("# include \"logic.h\"\n");
|
||||||
draw_AND();
|
draw_AND();
|
||||||
draw_BUF();
|
draw_BUF();
|
||||||
draw_BUFIF0();
|
draw_BUFIF0();
|
||||||
|
|
@ -616,6 +616,9 @@ main()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: draw_tt.c,v $
|
* $Log: draw_tt.c,v $
|
||||||
|
* Revision 1.11 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
* Revision 1.10 2001/10/09 02:28:17 steve
|
* Revision 1.10 2001/10/09 02:28:17 steve
|
||||||
* Add the PMOS and NMOS functor types.
|
* Add the PMOS and NMOS functor types.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
||||||
|
*
|
||||||
|
* This source code is free software; you can redistribute it
|
||||||
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
* General Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
|
*/
|
||||||
|
#if !defined(WINNT)
|
||||||
|
#ident "$Id: event.cc,v 1.1 2001/11/06 03:07:22 steve Exp $"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# include "event.h"
|
||||||
|
# include "compile.h"
|
||||||
|
# include "vthread.h"
|
||||||
|
# include "schedule.h"
|
||||||
|
|
||||||
|
# include <string.h>
|
||||||
|
# include <assert.h>
|
||||||
|
#ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
event_functor_s::event_functor_s(edge_t e)
|
||||||
|
: edge(e), threads(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
event_functor_s::~event_functor_s()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void event_functor_s::set(vvp_ipoint_t ptr, bool, unsigned val, unsigned)
|
||||||
|
{
|
||||||
|
old_ival = ival;
|
||||||
|
put(ptr, val);
|
||||||
|
/* Only go through the effort if there is someone interested
|
||||||
|
in the results... */
|
||||||
|
if (threads || out) {
|
||||||
|
|
||||||
|
bool edge_p = true;
|
||||||
|
|
||||||
|
if (edge) {
|
||||||
|
|
||||||
|
unsigned pp = ipoint_port(ptr);
|
||||||
|
|
||||||
|
unsigned oval = (old_ival >> 2*pp) & 3;
|
||||||
|
unsigned nval = (ival >> 2*pp) & 3;
|
||||||
|
|
||||||
|
unsigned val = (oval << 2) | nval;
|
||||||
|
edge_p = ((edge>>val) & 1) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (edge_p) {
|
||||||
|
vthread_t tmp = threads;
|
||||||
|
threads = 0;
|
||||||
|
vthread_schedule_list(tmp);
|
||||||
|
|
||||||
|
if (out)
|
||||||
|
// only one output? Why not propagate?
|
||||||
|
schedule_assign(out, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Create an event functor
|
||||||
|
** edge: compile_event(label, type, argc, argv)
|
||||||
|
** or: compile_event(label, NULL, argc, argv)
|
||||||
|
** name: compile_event(label, name, NULL, NULL)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void compile_event(char*label, char*type,
|
||||||
|
unsigned argc, struct symb_s*argv)
|
||||||
|
{
|
||||||
|
event_functor_s::edge_t edge = vvp_edge_none;
|
||||||
|
|
||||||
|
if (argc && type) {
|
||||||
|
if (strcmp(type,"posedge") == 0)
|
||||||
|
edge = vvp_edge_posedge;
|
||||||
|
else if (strcmp(type,"negedge") == 0)
|
||||||
|
edge = vvp_edge_negedge;
|
||||||
|
else if (strcmp(type,"edge") == 0)
|
||||||
|
edge = vvp_edge_anyedge;
|
||||||
|
|
||||||
|
assert(argc <= 4 || edge == vvp_edge_none);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!argc && type) {
|
||||||
|
// "type" is the name of the named event
|
||||||
|
}
|
||||||
|
|
||||||
|
free(type);
|
||||||
|
|
||||||
|
functor_t obj = new event_functor_s(edge);
|
||||||
|
|
||||||
|
vvp_ipoint_t fdx = functor_allocate(1);
|
||||||
|
functor_define(fdx, obj);
|
||||||
|
define_functor_symbol(label, fdx);
|
||||||
|
free(label);
|
||||||
|
|
||||||
|
/* Run through the arguments looking for the functors that are
|
||||||
|
connected to my input ports. For each source functor that I
|
||||||
|
find, connect the output of that functor to the indexed
|
||||||
|
input by inserting myself (complete with the port number in
|
||||||
|
the vvp_ipoint_t) into the list that the source heads.
|
||||||
|
|
||||||
|
If the source functor is not declared yet, then don't do
|
||||||
|
the link yet. Save the reference to be resolved later. */
|
||||||
|
|
||||||
|
if (edge != vvp_edge_none)
|
||||||
|
inputs_connect(fdx, argc, argv);
|
||||||
|
else
|
||||||
|
// Are we sure that we have those .event/or
|
||||||
|
// drivers exclusively?
|
||||||
|
for (unsigned i=0; i<argc; i++) {
|
||||||
|
inputs_connect(fdx, 1, argv+i);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $Log: event.cc,v $
|
||||||
|
* Revision 1.1 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
#ifndef __event_H
|
||||||
|
#define __event_H
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2000 Stephen Williams (steve@icarus.com)
|
||||||
|
*
|
||||||
|
* This source code is free software; you can redistribute it
|
||||||
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
* General Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
|
*/
|
||||||
|
#if !defined(WINNT)
|
||||||
|
#ident "$Id: event.h,v 1.1 2001/11/06 03:07:22 steve Exp $"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# include "functor.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Event / edge detection functors
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct event_functor_s: public edge_inputs_functor_s {
|
||||||
|
typedef unsigned short edge_t;
|
||||||
|
explicit event_functor_s(edge_t e);
|
||||||
|
virtual ~event_functor_s();
|
||||||
|
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
||||||
|
edge_t edge;
|
||||||
|
vthread_t threads;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define VVP_EDGE(a,b) (1<<(((a)<<2)|(b)))
|
||||||
|
|
||||||
|
const event_functor_s::edge_t vvp_edge_posedge
|
||||||
|
= VVP_EDGE(0,1)
|
||||||
|
| VVP_EDGE(0,2)
|
||||||
|
| VVP_EDGE(0,3)
|
||||||
|
| VVP_EDGE(2,1)
|
||||||
|
| VVP_EDGE(3,1)
|
||||||
|
;
|
||||||
|
|
||||||
|
const event_functor_s::edge_t vvp_edge_negedge
|
||||||
|
= VVP_EDGE(1,0)
|
||||||
|
| VVP_EDGE(1,2)
|
||||||
|
| VVP_EDGE(1,3)
|
||||||
|
| VVP_EDGE(2,0)
|
||||||
|
| VVP_EDGE(3,0)
|
||||||
|
;
|
||||||
|
|
||||||
|
const event_functor_s::edge_t vvp_edge_anyedge = 0x7bde;
|
||||||
|
const event_functor_s::edge_t vvp_edge_none = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback functors.
|
||||||
|
*/
|
||||||
|
struct callback_functor_s *vvp_fvector_make_callback
|
||||||
|
(vvp_fvector_t, event_functor_s::edge_t = vvp_edge_none);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $Log: event.h,v $
|
||||||
|
* Revision 1.1 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#endif // __event_H
|
||||||
|
|
@ -17,17 +17,13 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: functor.cc,v 1.31 2001/11/04 05:03:21 steve Exp $"
|
#ident "$Id: functor.cc,v 1.32 2001/11/06 03:07:22 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "functor.h"
|
# include "functor.h"
|
||||||
# include "schedule.h"
|
|
||||||
# include "vthread.h"
|
|
||||||
# include "vpi_priv.h"
|
|
||||||
# include "debug.h"
|
# include "debug.h"
|
||||||
# include <assert.h>
|
# include <assert.h>
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
# include <stdlib.h>
|
|
||||||
#ifdef HAVE_MALLOC_H
|
#ifdef HAVE_MALLOC_H
|
||||||
# include <malloc.h>
|
# include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -107,60 +103,34 @@ void functor_define(vvp_ipoint_t point, functor_t obj)
|
||||||
functor_list[index1][index2] = obj;
|
functor_list[index1][index2] = obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void table_functor_s::set(vvp_ipoint_t ptr, bool push, unsigned v, unsigned)
|
|
||||||
|
functor_s::functor_s()
|
||||||
{
|
{
|
||||||
put(ptr, v);
|
out = 0;
|
||||||
|
port[0] = 0;
|
||||||
/* Locate the new output value in the table. */
|
port[1] = 0;
|
||||||
unsigned char val = table[ival >> 2];
|
port[2] = 0;
|
||||||
val >>= 2 * (ival&0x03);
|
port[3] = 0;
|
||||||
val &= 0x03;
|
ival = 0xaa;
|
||||||
|
oval = 2;
|
||||||
put_oval(ptr, push, val);
|
odrive0 = 6;
|
||||||
|
odrive1 = 6;
|
||||||
|
ostr = StX;
|
||||||
|
inhibit = 0;
|
||||||
|
#if defined(WITH_DEBUG)
|
||||||
|
breakpoint = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
functor_s::~functor_s()
|
||||||
* An event functor is a probe of some sort that is looking for an edge
|
|
||||||
* of some specified type on any of its inputs. If it finds the right
|
|
||||||
* kind of edge, then it awakens all the threads that are waiting on
|
|
||||||
* this functor *and* it schedules an assign for any output it might
|
|
||||||
* have. The latter is to support wider event/or then a single functor
|
|
||||||
* can support.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void event_functor_s::set(vvp_ipoint_t ptr, bool, unsigned val, unsigned)
|
|
||||||
{
|
{
|
||||||
old_ival = ival;
|
|
||||||
put(ptr, val);
|
|
||||||
/* Only go through the effort if there is someone interested
|
|
||||||
in the results... */
|
|
||||||
if (threads || out) {
|
|
||||||
|
|
||||||
bool edge_p = true;
|
|
||||||
|
|
||||||
if (edge) {
|
|
||||||
|
|
||||||
unsigned pp = ipoint_port(ptr);
|
|
||||||
|
|
||||||
unsigned oval = (old_ival >> 2*pp) & 3;
|
|
||||||
unsigned nval = (ival >> 2*pp) & 3;
|
|
||||||
|
|
||||||
unsigned val = (oval << 2) | nval;
|
|
||||||
edge_p = ((edge>>val) & 1) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (edge_p) {
|
|
||||||
vthread_t tmp = threads;
|
|
||||||
threads = 0;
|
|
||||||
vthread_schedule_list(tmp);
|
|
||||||
|
|
||||||
if (out)
|
|
||||||
// only one output? Why not propagate?
|
|
||||||
schedule_assign(out, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Special infrastructure functor types
|
||||||
|
|
||||||
|
extra_outputs_functor_s::~extra_outputs_functor_s()
|
||||||
|
{}
|
||||||
|
|
||||||
void extra_outputs_functor_s::set(vvp_ipoint_t i, bool push,
|
void extra_outputs_functor_s::set(vvp_ipoint_t i, bool push,
|
||||||
unsigned val, unsigned)
|
unsigned val, unsigned)
|
||||||
{
|
{
|
||||||
|
|
@ -170,6 +140,9 @@ void extra_outputs_functor_s::set(vvp_ipoint_t i, bool push,
|
||||||
base->set(base_, push, val);
|
base->set(base_, push, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extra_ports_functor_s::~extra_ports_functor_s()
|
||||||
|
{}
|
||||||
|
|
||||||
void extra_ports_functor_s::set(vvp_ipoint_t i, bool push,
|
void extra_ports_functor_s::set(vvp_ipoint_t i, bool push,
|
||||||
unsigned val, unsigned str)
|
unsigned val, unsigned str)
|
||||||
{
|
{
|
||||||
|
|
@ -177,6 +150,9 @@ void extra_ports_functor_s::set(vvp_ipoint_t i, bool push,
|
||||||
base->set(i, push, val, str);
|
base->set(i, push, val, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extra_inputs_functor_s::~extra_inputs_functor_s()
|
||||||
|
{}
|
||||||
|
|
||||||
void extra_inputs_functor_s::set(vvp_ipoint_t i, bool push,
|
void extra_inputs_functor_s::set(vvp_ipoint_t i, bool push,
|
||||||
unsigned val, unsigned)
|
unsigned val, unsigned)
|
||||||
{
|
{
|
||||||
|
|
@ -186,9 +162,14 @@ void extra_inputs_functor_s::set(vvp_ipoint_t i, bool push,
|
||||||
base->set(ipoint_make(out,0), push, val);
|
base->set(ipoint_make(out,0), push, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
edge_inputs_functor_s::~edge_inputs_functor_s()
|
||||||
|
{}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: functor.cc,v $
|
* $Log: functor.cc,v $
|
||||||
|
* Revision 1.32 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
* Revision 1.31 2001/11/04 05:03:21 steve
|
* Revision 1.31 2001/11/04 05:03:21 steve
|
||||||
* MacOSX 10.1 updates.
|
* MacOSX 10.1 updates.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
122
vvp/functor.h
122
vvp/functor.h
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: functor.h,v 1.36 2001/11/01 03:00:19 steve Exp $"
|
#ident "$Id: functor.h,v 1.37 2001/11/06 03:07:22 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "pointers.h"
|
# include "pointers.h"
|
||||||
|
|
@ -32,11 +32,6 @@
|
||||||
extern void schedule_functor(vvp_ipoint_t fun, unsigned delay);
|
extern void schedule_functor(vvp_ipoint_t fun, unsigned delay);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
|
||||||
* The major mode is selected by the mode parameter.
|
|
||||||
*
|
|
||||||
* MODE 0: TABLE MODE FUNCTORS
|
|
||||||
*
|
|
||||||
* The vvp_ipoint_t is an integral type that is 32bits. The low 2 bits
|
* The vvp_ipoint_t is an integral type that is 32bits. The low 2 bits
|
||||||
* select the port of the referenced functor, and the remaining 30
|
* select the port of the referenced functor, and the remaining 30
|
||||||
* index the functor itself. All together, the 32 bits can completely
|
* index the functor itself. All together, the 32 bits can completely
|
||||||
|
|
@ -55,22 +50,9 @@ extern void schedule_functor(vvp_ipoint_t fun, unsigned delay);
|
||||||
* 1'bx : 10
|
* 1'bx : 10
|
||||||
* 1'bz : 11
|
* 1'bz : 11
|
||||||
*
|
*
|
||||||
* The function of the functor is defined by the table/event
|
|
||||||
* union. Normally, the truth table is the behavior and the functor
|
|
||||||
* output value is picked from the lookup table that the table pointer
|
|
||||||
* points to.
|
|
||||||
*
|
|
||||||
* MODE 42: LIFE, THE UNIVERSE AND EVERYTHING ELSE
|
|
||||||
*
|
|
||||||
* These functors are and escape for all other behaviors. This mode
|
|
||||||
* supports arbitrary complex behavior by replacing the truth table
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* DRIVE STRENGTHS:
|
* DRIVE STRENGTHS:
|
||||||
*
|
*
|
||||||
* The normal functor (modes 0) is not aware of strengths. It
|
* The normal functor is not aware of strengths. It
|
||||||
* generates strength simply by virtue of having strength
|
* generates strength simply by virtue of having strength
|
||||||
* specifications. The drive strength specification includes a drive0
|
* specifications. The drive strength specification includes a drive0
|
||||||
* and drive1 strength, each with 8 possible values (that can be
|
* and drive1 strength, each with 8 possible values (that can be
|
||||||
|
|
@ -168,6 +150,7 @@ extern void functor_define(vvp_ipoint_t point, functor_t obj);
|
||||||
|
|
||||||
struct functor_s {
|
struct functor_s {
|
||||||
functor_s();
|
functor_s();
|
||||||
|
virtual ~functor_s();
|
||||||
/* This is the output for the device. */
|
/* This is the output for the device. */
|
||||||
vvp_ipoint_t out;
|
vvp_ipoint_t out;
|
||||||
/* These are the input ports. */
|
/* These are the input ports. */
|
||||||
|
|
@ -207,24 +190,6 @@ struct functor_s {
|
||||||
void force(unsigned val, unsigned str);
|
void force(unsigned val, unsigned str);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline functor_s::functor_s()
|
|
||||||
{
|
|
||||||
out = 0;
|
|
||||||
port[0] = 0;
|
|
||||||
port[1] = 0;
|
|
||||||
port[2] = 0;
|
|
||||||
port[3] = 0;
|
|
||||||
ival = 0xaa;
|
|
||||||
oval = 2;
|
|
||||||
odrive0 = 6;
|
|
||||||
odrive1 = 6;
|
|
||||||
ostr = StX;
|
|
||||||
inhibit = 0;
|
|
||||||
#if defined(WITH_DEBUG)
|
|
||||||
breakpoint = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the ival for input port ptr to value val.
|
* Set the ival for input port ptr to value val.
|
||||||
*/
|
*/
|
||||||
|
|
@ -340,19 +305,24 @@ unsigned functor_get(vvp_ipoint_t ptr)
|
||||||
* the inputs it is connected to, creating new propagation event on
|
* the inputs it is connected to, creating new propagation event on
|
||||||
* the way.
|
* the way.
|
||||||
*/
|
*/
|
||||||
static inline
|
inline static
|
||||||
void functor_propagate(vvp_ipoint_t ptr, bool push=true)
|
void functor_propagate(vvp_ipoint_t ptr, bool push=true)
|
||||||
{
|
{
|
||||||
functor_t fp = functor_index(ptr);
|
functor_t fp = functor_index(ptr);
|
||||||
fp->propagate(push);
|
fp->propagate(push);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Special infrastructure functor types
|
||||||
|
|
||||||
|
|
||||||
// The extra_outputs_functor_s class is for devices that require
|
// The extra_outputs_functor_s class is for devices that require
|
||||||
// multiple inputs and outputs.
|
// multiple inputs and outputs.
|
||||||
// ->set redirects the job to the base_, who knows what shall be done.
|
// ->set redirects the job to the base_, who knows what shall be done.
|
||||||
|
|
||||||
struct extra_outputs_functor_s: public functor_s {
|
struct extra_outputs_functor_s: public functor_s {
|
||||||
extra_outputs_functor_s(vvp_ipoint_t b = 0) : base_(b) {}
|
extra_outputs_functor_s(vvp_ipoint_t b = 0) : base_(b) {}
|
||||||
|
virtual ~extra_outputs_functor_s();
|
||||||
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
||||||
|
|
||||||
unsigned base_;
|
unsigned base_;
|
||||||
|
|
@ -365,6 +335,7 @@ struct extra_outputs_functor_s: public functor_s {
|
||||||
struct extra_ports_functor_s : public extra_outputs_functor_s
|
struct extra_ports_functor_s : public extra_outputs_functor_s
|
||||||
{
|
{
|
||||||
extra_ports_functor_s(vvp_ipoint_t b = 0) : extra_outputs_functor_s(b) {}
|
extra_ports_functor_s(vvp_ipoint_t b = 0) : extra_outputs_functor_s(b) {}
|
||||||
|
virtual ~extra_ports_functor_s();
|
||||||
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -374,6 +345,7 @@ struct extra_ports_functor_s : public extra_outputs_functor_s
|
||||||
|
|
||||||
struct extra_inputs_functor_s: public functor_s {
|
struct extra_inputs_functor_s: public functor_s {
|
||||||
extra_inputs_functor_s(vvp_ipoint_t b = 0) { out = b; }
|
extra_inputs_functor_s(vvp_ipoint_t b = 0) { out = b; }
|
||||||
|
virtual ~extra_inputs_functor_s();
|
||||||
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -383,77 +355,10 @@ struct extra_inputs_functor_s: public functor_s {
|
||||||
struct edge_inputs_functor_s: public extra_inputs_functor_s
|
struct edge_inputs_functor_s: public extra_inputs_functor_s
|
||||||
{
|
{
|
||||||
edge_inputs_functor_s() : old_ival(2) {}
|
edge_inputs_functor_s() : old_ival(2) {}
|
||||||
|
virtual ~edge_inputs_functor_s();
|
||||||
unsigned char old_ival;
|
unsigned char old_ival;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Table driven functor. oval = table[ival];
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct table_functor_s: public functor_s {
|
|
||||||
typedef const unsigned char *truth_t;
|
|
||||||
explicit table_functor_s(truth_t t) : table(t) {}
|
|
||||||
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
|
||||||
truth_t table;
|
|
||||||
};
|
|
||||||
|
|
||||||
// table functor types
|
|
||||||
|
|
||||||
extern const unsigned char ft_AND[];
|
|
||||||
extern const unsigned char ft_BUF[];
|
|
||||||
extern const unsigned char ft_BUFIF0[];
|
|
||||||
extern const unsigned char ft_BUFIF1[];
|
|
||||||
extern const unsigned char ft_PMOS[];
|
|
||||||
extern const unsigned char ft_NMOS[];
|
|
||||||
extern const unsigned char ft_MUXZ[];
|
|
||||||
extern const unsigned char ft_EEQ[];
|
|
||||||
extern const unsigned char ft_NAND[];
|
|
||||||
extern const unsigned char ft_NOR[];
|
|
||||||
extern const unsigned char ft_NOT[];
|
|
||||||
extern const unsigned char ft_OR[];
|
|
||||||
extern const unsigned char ft_XNOR[];
|
|
||||||
extern const unsigned char ft_XOR[];
|
|
||||||
extern const unsigned char ft_var[];
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Event / edge detection functors
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct event_functor_s: public edge_inputs_functor_s {
|
|
||||||
typedef unsigned short edge_t;
|
|
||||||
explicit event_functor_s(edge_t e) : edge(e), threads(0) {}
|
|
||||||
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
|
||||||
edge_t edge;
|
|
||||||
vthread_t threads;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define VVP_EDGE(a,b) (1<<(((a)<<2)|(b)))
|
|
||||||
|
|
||||||
const event_functor_s::edge_t vvp_edge_posedge
|
|
||||||
= VVP_EDGE(0,1)
|
|
||||||
| VVP_EDGE(0,2)
|
|
||||||
| VVP_EDGE(0,3)
|
|
||||||
| VVP_EDGE(2,1)
|
|
||||||
| VVP_EDGE(3,1)
|
|
||||||
;
|
|
||||||
|
|
||||||
const event_functor_s::edge_t vvp_edge_negedge
|
|
||||||
= VVP_EDGE(1,0)
|
|
||||||
| VVP_EDGE(1,2)
|
|
||||||
| VVP_EDGE(1,3)
|
|
||||||
| VVP_EDGE(2,0)
|
|
||||||
| VVP_EDGE(3,0)
|
|
||||||
;
|
|
||||||
|
|
||||||
const event_functor_s::edge_t vvp_edge_anyedge = 0x7bde;
|
|
||||||
const event_functor_s::edge_t vvp_edge_none = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Callback functors.
|
|
||||||
*/
|
|
||||||
struct callback_functor_s *vvp_fvector_make_callback
|
|
||||||
(vvp_fvector_t, event_functor_s::edge_t = vvp_edge_none);
|
|
||||||
/*
|
/*
|
||||||
* Vectors of functors
|
* Vectors of functors
|
||||||
*/
|
*/
|
||||||
|
|
@ -468,6 +373,9 @@ extern vvp_fvector_t vvp_fvector_continuous_new(unsigned size, vvp_ipoint_t p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: functor.h,v $
|
* $Log: functor.h,v $
|
||||||
|
* Revision 1.37 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
* Revision 1.36 2001/11/01 03:00:19 steve
|
* Revision 1.36 2001/11/01 03:00:19 steve
|
||||||
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
||||||
|
*
|
||||||
|
* This source code is free software; you can redistribute it
|
||||||
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
* General Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
|
*/
|
||||||
|
#if !defined(WINNT)
|
||||||
|
#ident "$Id: logic.cc,v 1.1 2001/11/06 03:07:22 steve Exp $"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# include "logic.h"
|
||||||
|
# include "compile.h"
|
||||||
|
# include "bufif.h"
|
||||||
|
# include "npmos.h"
|
||||||
|
|
||||||
|
# include <string.h>
|
||||||
|
# include <assert.h>
|
||||||
|
#ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Implementation of the table functor, which provides logic with up
|
||||||
|
* to 4 inputs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
inline table_functor_s::table_functor_s(truth_t t)
|
||||||
|
: table(t)
|
||||||
|
{}
|
||||||
|
|
||||||
|
table_functor_s::~table_functor_s()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void table_functor_s::set(vvp_ipoint_t ptr, bool push, unsigned v, unsigned)
|
||||||
|
{
|
||||||
|
put(ptr, v);
|
||||||
|
|
||||||
|
/* Locate the new output value in the table. */
|
||||||
|
unsigned char val = table[ival >> 2];
|
||||||
|
val >>= 2 * (ival&0x03);
|
||||||
|
val &= 0x03;
|
||||||
|
|
||||||
|
put_oval(ptr, push, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The parser calls this function to create a logic functor. I allocate a
|
||||||
|
* functor, and map the name to the vvp_ipoint_t address for the
|
||||||
|
* functor. Also resolve the inputs to the functor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void compile_functor(char*label, char*type, unsigned argc, struct symb_s*argv)
|
||||||
|
{
|
||||||
|
functor_t obj;
|
||||||
|
|
||||||
|
if (strcmp(type, "OR") == 0) {
|
||||||
|
obj = new table_functor_s(ft_OR);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "AND") == 0) {
|
||||||
|
obj = new table_functor_s(ft_AND);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "BUF") == 0) {
|
||||||
|
obj = new table_functor_s(ft_BUF);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "BUFIF0") == 0) {
|
||||||
|
obj = new vvp_bufif0_s;
|
||||||
|
|
||||||
|
} else if (strcmp(type, "BUFIF1") == 0) {
|
||||||
|
obj = new vvp_bufif1_s;
|
||||||
|
|
||||||
|
} else if (strcmp(type, "PMOS") == 0) {
|
||||||
|
obj = new vvp_pmos_s;
|
||||||
|
|
||||||
|
} else if (strcmp(type, "NMOS") == 0) {
|
||||||
|
obj= new vvp_nmos_s;
|
||||||
|
|
||||||
|
} else if (strcmp(type, "RPMOS") == 0) {
|
||||||
|
obj = new vvp_rpmos_s;
|
||||||
|
|
||||||
|
} else if (strcmp(type, "RNMOS") == 0) {
|
||||||
|
obj = new vvp_rnmos_s;
|
||||||
|
|
||||||
|
} else if (strcmp(type, "MUXZ") == 0) {
|
||||||
|
obj = new table_functor_s(ft_MUXZ);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "EEQ") == 0) {
|
||||||
|
obj = new table_functor_s(ft_EEQ);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "NAND") == 0) {
|
||||||
|
obj = new table_functor_s(ft_NAND);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "NOR") == 0) {
|
||||||
|
obj = new table_functor_s(ft_NOR);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "NOT") == 0) {
|
||||||
|
obj = new table_functor_s(ft_NOT);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "XNOR") == 0) {
|
||||||
|
obj = new table_functor_s(ft_XNOR);
|
||||||
|
|
||||||
|
} else if (strcmp(type, "XOR") == 0) {
|
||||||
|
obj = new table_functor_s(ft_XOR);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
yyerror("invalid functor type.");
|
||||||
|
free(type);
|
||||||
|
free(argv);
|
||||||
|
free(label);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(type);
|
||||||
|
|
||||||
|
assert(argc <= 4);
|
||||||
|
vvp_ipoint_t fdx = functor_allocate(1);
|
||||||
|
functor_define(fdx, obj);
|
||||||
|
define_functor_symbol(label, fdx);
|
||||||
|
free(label);
|
||||||
|
|
||||||
|
inputs_connect(fdx, argc, argv);
|
||||||
|
free(argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $Log: logic.cc,v $
|
||||||
|
* Revision 1.1 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
#ifndef __logic_H
|
||||||
|
#define __logic_H
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2000 Stephen Williams (steve@icarus.com)
|
||||||
|
*
|
||||||
|
* This source code is free software; you can redistribute it
|
||||||
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
* General Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2 of the License, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
|
*/
|
||||||
|
#if !defined(WINNT)
|
||||||
|
#ident "$Id: logic.h,v 1.1 2001/11/06 03:07:22 steve Exp $"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# include "functor.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Table driven functor. oval = table[ival];
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct table_functor_s: public functor_s {
|
||||||
|
typedef const unsigned char *truth_t;
|
||||||
|
explicit table_functor_s(truth_t t);
|
||||||
|
virtual ~table_functor_s();
|
||||||
|
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
||||||
|
truth_t table;
|
||||||
|
};
|
||||||
|
|
||||||
|
// table functor types
|
||||||
|
|
||||||
|
extern const unsigned char ft_AND[];
|
||||||
|
extern const unsigned char ft_BUF[];
|
||||||
|
extern const unsigned char ft_BUFIF0[];
|
||||||
|
extern const unsigned char ft_BUFIF1[];
|
||||||
|
extern const unsigned char ft_PMOS[];
|
||||||
|
extern const unsigned char ft_NMOS[];
|
||||||
|
extern const unsigned char ft_MUXZ[];
|
||||||
|
extern const unsigned char ft_EEQ[];
|
||||||
|
extern const unsigned char ft_NAND[];
|
||||||
|
extern const unsigned char ft_NOR[];
|
||||||
|
extern const unsigned char ft_NOT[];
|
||||||
|
extern const unsigned char ft_OR[];
|
||||||
|
extern const unsigned char ft_XNOR[];
|
||||||
|
extern const unsigned char ft_XOR[];
|
||||||
|
extern const unsigned char ft_var[];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $Log: logic.h,v $
|
||||||
|
* Revision 1.1 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#endif // __logic_H
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: vpi_callback.cc,v 1.9 2001/10/31 04:27:47 steve Exp $"
|
#ident "$Id: vpi_callback.cc,v 1.10 2001/11/06 03:07:22 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
# include "vpi_priv.h"
|
# include "vpi_priv.h"
|
||||||
# include "schedule.h"
|
# include "schedule.h"
|
||||||
# include "functor.h"
|
# include "functor.h"
|
||||||
|
# include "event.h"
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# include <assert.h>
|
# include <assert.h>
|
||||||
#ifdef HAVE_MALLOC_H
|
#ifdef HAVE_MALLOC_H
|
||||||
|
|
@ -100,12 +101,20 @@ inline static void free_vpi_callback(struct __vpiCallback* obj)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct callback_functor_s: public functor_s {
|
struct callback_functor_s: public functor_s {
|
||||||
callback_functor_s() : permanent(0) {}
|
callback_functor_s();
|
||||||
|
virtual ~callback_functor_s();
|
||||||
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
||||||
struct __vpiCallback *cb_handle;
|
struct __vpiCallback *cb_handle;
|
||||||
unsigned permanent : 1;
|
unsigned permanent : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline callback_functor_s::callback_functor_s()
|
||||||
|
: permanent(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
callback_functor_s::~callback_functor_s()
|
||||||
|
{}
|
||||||
|
|
||||||
struct callback_functor_s *vvp_fvector_make_callback(vvp_fvector_t vec,
|
struct callback_functor_s *vvp_fvector_make_callback(vvp_fvector_t vec,
|
||||||
event_functor_s::edge_t edge)
|
event_functor_s::edge_t edge)
|
||||||
{
|
{
|
||||||
|
|
@ -300,6 +309,9 @@ void vpip_trip_monitor_callbacks(void)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vpi_callback.cc,v $
|
* $Log: vpi_callback.cc,v $
|
||||||
|
* Revision 1.10 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
* Revision 1.9 2001/10/31 04:27:47 steve
|
* Revision 1.9 2001/10/31 04:27:47 steve
|
||||||
* Rewrite the functor type to have fewer functor modes,
|
* Rewrite the functor type to have fewer functor modes,
|
||||||
* and use objects to manage the different types.
|
* and use objects to manage the different types.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: vthread.cc,v 1.63 2001/11/01 03:00:20 steve Exp $"
|
#ident "$Id: vthread.cc,v 1.64 2001/11/06 03:07:22 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "vthread.h"
|
# include "vthread.h"
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
# include "debug.h"
|
# include "debug.h"
|
||||||
# include "schedule.h"
|
# include "schedule.h"
|
||||||
# include "functor.h"
|
# include "functor.h"
|
||||||
|
# include "event.h"
|
||||||
# include "vpi_priv.h"
|
# include "vpi_priv.h"
|
||||||
#ifdef HAVE_MALLOC_H
|
#ifdef HAVE_MALLOC_H
|
||||||
# include <malloc.h>
|
# include <malloc.h>
|
||||||
|
|
@ -1671,6 +1672,9 @@ bool of_ZOMBIE(vthread_t thr, vvp_code_t)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vthread.cc,v $
|
* $Log: vthread.cc,v $
|
||||||
|
* Revision 1.64 2001/11/06 03:07:22 steve
|
||||||
|
* Code rearrange. (Stephan Boettcher)
|
||||||
|
*
|
||||||
* Revision 1.63 2001/11/01 03:00:20 steve
|
* Revision 1.63 2001/11/01 03:00:20 steve
|
||||||
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue