Introduce the means to get statement types.

This commit is contained in:
steve 2000-09-19 04:15:27 +00:00
parent ea53f2b54f
commit 39cf6bd164
5 changed files with 251 additions and 38 deletions

View File

@ -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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: ivl_target.h,v 1.7 2000/09/18 01:24:32 steve Exp $" #ident "$Id: ivl_target.h,v 1.8 2000/09/19 04:15:27 steve Exp $"
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
@ -40,7 +40,7 @@ _BEGIN_DECL
* behavior. * behavior.
* *
* The interface is divided into two parts: the entry points within * The interface is divided into two parts: the entry points within
* the core that are called by the module, and then entry points in * the core that are called by the module, and the entry points in
* the module that are called by the core. It is the latter that * the module that are called by the core. It is the latter that
* causes the module to be invoked in the first place, but most of the * causes the module to be invoked in the first place, but most of the
* interesting information about the design is accessed through the * interesting information about the design is accessed through the
@ -70,6 +70,46 @@ typedef struct ivl_process_s *ivl_process_t;
typedef struct ivl_scope_s *ivl_scope_t; typedef struct ivl_scope_s *ivl_scope_t;
typedef struct ivl_statement_s*ivl_statement_t; typedef struct ivl_statement_s*ivl_statement_t;
/*
* These are types that are defined as enumerations. These have
* explicit values so that the binary API is a bit more resilient to
* changes and additions to the enumerations.
*/
typedef enum ivl_logic_e {
IVL_LO_NONE = 0,
IVL_LO_AND,
IVL_LO_BUF,
IVL_LO_BUFIF0,
IVL_LO_BUFIF1,
IVL_LO_NAND,
IVL_LO_NOR,
IVL_LO_NOT,
IVL_LO_NOTIF0,
IVL_LO_NOTIF1,
IVL_LO_OR,
IVL_LO_XNOR,
IVL_LO_XOR
} ivl_logic_t;
typedef enum ivl_process_type_e {
IVL_PR_INITIAL = 0,
IVL_PR_ALWAYS = 1
} ivl_process_type_t;
typedef enum ivl_statement_type_e {
IVL_ST_NONE = 0,
IVL_ST_NOOP = 1,
IVL_ST_ASSIGN,
IVL_ST_BLOCK,
IVL_ST_CONDIT,
IVL_ST_DELAY,
IVL_ST_DELAYX,
IVL_ST_STASK,
IVL_ST_WAIT,
IVL_ST_WHILE
} ivl_statement_type_t;
/* This function returns the string value of the named flag. The key /* This function returns the string value of the named flag. The key
is used to select the flag. If the key does not exist or the flag is used to select the flag. If the key does not exist or the flag
@ -88,16 +128,11 @@ extern const char* ivl_get_root_name(ivl_design_t net);
/* LOGIC /* LOGIC
* These types and functions support manipulation of logic gates. The * These types and functions support manipulation of logic gates. The
* ivl_logit_t enumeration identifies the various kinds of gates that * ivl_logic_t enumeration identifies the various kinds of gates that
* the ivl_net_logic_t can represent. The various functions then * the ivl_net_logic_t can represent. The various functions then
* provide access to the various bits of information for a given logic * provide access to the bits of information for a given logic device.
* device.
*/ */
typedef enum ivl_logic_e { IVL_AND, IVL_BUF, IVL_BUFIF0, IVL_BUFIF1,
IVL_NAND, IVL_NOR, IVL_NOT, IVL_NOTIF0,
IVL_NOTIF1, IVL_OR, IVL_XNOR, IVL_XOR } ivl_logic_t;
extern ivl_logic_t ivl_get_logic_type(ivl_net_logic_t net); extern ivl_logic_t ivl_get_logic_type(ivl_net_logic_t net);
extern ivl_nexus_t ivl_get_logic_pin(ivl_net_logic_t net, unsigned pin); extern ivl_nexus_t ivl_get_logic_pin(ivl_net_logic_t net, unsigned pin);
extern unsigned ivl_get_logic_pins(ivl_net_logic_t net); extern unsigned ivl_get_logic_pins(ivl_net_logic_t net);
@ -109,7 +144,6 @@ extern unsigned ivl_get_logic_pins(ivl_net_logic_t net);
extern const char* ivl_get_nexus_name(ivl_nexus_t net); extern const char* ivl_get_nexus_name(ivl_nexus_t net);
extern unsigned ivl_get_signal_pins(ivl_net_signal_t net); extern unsigned ivl_get_signal_pins(ivl_net_signal_t net);
@ -122,21 +156,52 @@ extern unsigned ivl_get_signal_pins(ivl_net_signal_t net);
* The ivl_get_process_type function gets the type of the process, * The ivl_get_process_type function gets the type of the process,
* an "inital" or "always" statement. * an "inital" or "always" statement.
* *
* The ivl_get_process_stmt functin gets the statement that forms the * The ivl_get_process_stmt function gets the statement that forms the
* process. See the statement related functions for how to manipulate * process. See the statement related functions for how to manipulate
* statements. * statements.
*/ */
typedef enum ivl_process_type {
IVL_PR_INITIAL = 0,
IVL_PR_ALWAYS = 1
} ivl_process_type_t;
extern ivl_process_type_t ivl_get_process_type(ivl_process_t net); extern ivl_process_type_t ivl_get_process_type(ivl_process_t net);
extern ivl_statement_t ivl_get_process_stmt(ivl_process_t net); extern ivl_statement_t ivl_get_process_stmt(ivl_process_t net);
/*
* These functions manage statements of various type. This includes
* all the different kinds of statements (as enumerated in
* ivl_statement_type_t) that might occur in behavioral code.
*
* The ivl_statement_type() function returns the type code for the
* statement. This is the major type, and implies which of the later
* functions are applicable to the statemnt.
*/
extern ivl_statement_type_t ivl_statement_type(ivl_statement_t net);
/*
* The following functions retrieve specific single values from the
* statement. These values are the bits of data and parameters that
* make up the statement. Many of these functions apply to more then
* one type of statement, so the comment in front of them tells which
* statement types can be passed to the function.
*/
/* IVL_ST_BLOCK */
extern unsigned ivl_stmt_block_count(ivl_statement_t net);
/* IVL_ST_BLOCK */
extern ivl_statement_t ivl_stmt_block_stmt(ivl_statement_t net, unsigned i);
/* IVL_ST_CONDIT */
extern ivl_statement_t ivl_stmt_cond_false(ivl_statement_t net);
extern ivl_statement_t ivl_stmt_cond_true(ivl_statement_t net);
/* IVL_ST_DELAY */
extern unsigned long ivl_stmt_delay_val(ivl_statement_t net);
/* IVL_ST_DELAY, IVL_ST_WAIT, IVL_ST_WHILE */
extern ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net);
/* TARGET MODULE ENTRY POINTS /* TARGET MODULE ENTRY POINTS
*
* These are not functions in the API but functions that the target
* module supplies. They are presented as typedefs of functions (which
* are used internally) but the target module makes them work by
* exporting them.
* *
* The module entry points generally take a cookie and possibly a name * The module entry points generally take a cookie and possibly a name
* as parameters. They use the cookie to get the required detailed * as parameters. They use the cookie to get the required detailed
@ -236,6 +301,9 @@ _END_DECL
/* /*
* $Log: ivl_target.h,v $ * $Log: ivl_target.h,v $
* Revision 1.8 2000/09/19 04:15:27 steve
* Introduce the means to get statement types.
*
* Revision 1.7 2000/09/18 01:24:32 steve * Revision 1.7 2000/09/18 01:24:32 steve
* Get the structure for ivl_statement_t worked out. * Get the structure for ivl_statement_t worked out.
* *

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
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: t-dll-api.cc,v 1.1 2000/09/18 01:24:32 steve Exp $" #ident "$Id: t-dll-api.cc,v 1.2 2000/09/19 04:15:27 steve Exp $"
#endif #endif
# include "t-dll.h" # include "t-dll.h"
@ -38,12 +38,12 @@ extern "C" ivl_logic_t ivl_get_logic_type(ivl_net_logic_t net)
{ {
switch (net->dev_->type()) { switch (net->dev_->type()) {
case NetLogic::AND: case NetLogic::AND:
return IVL_AND; return IVL_LO_AND;
case NetLogic::OR: case NetLogic::OR:
return IVL_OR; return IVL_LO_OR;
} }
assert(0); assert(0);
return IVL_AND; return IVL_LO_NONE;
} }
extern "C" unsigned ivl_get_logic_pins(ivl_net_logic_t net) extern "C" unsigned ivl_get_logic_pins(ivl_net_logic_t net)
@ -78,8 +78,70 @@ extern "C" unsigned ivl_get_signal_pins(ivl_net_signal_t net)
return sig->pin_count(); return sig->pin_count();
} }
extern "C" ivl_statement_type_t ivl_statement_type(ivl_statement_t net)
{
return net->type_;
}
extern "C" unsigned ivl_stmt_block_count(ivl_statement_t net)
{
assert(net->type_ == IVL_ST_BLOCK);
return net->u_.block_.nstmt_;
}
extern "C" ivl_statement_t ivl_stmt_block_stmt(ivl_statement_t net,
unsigned i)
{
assert(net->type_ == IVL_ST_BLOCK);
assert(i < net->u_.block_.nstmt_);
return net->u_.block_.stmt_ + i;
}
extern "C" ivl_statement_t ivl_stmt_cond_false(ivl_statement_t net)
{
assert(net->type_ == IVL_ST_CONDIT);
if (net->u_.condit_.stmt_[1].type_ == IVL_ST_NONE)
return 0;
else
return net->u_.condit_.stmt_ + 1;
}
extern "C" ivl_statement_t ivl_stmt_cond_true(ivl_statement_t net)
{
assert(net->type_ == IVL_ST_CONDIT);
if (net->u_.condit_.stmt_[0].type_ == IVL_ST_NONE)
return 0;
else
return net->u_.condit_.stmt_ + 0;
}
extern "C" unsigned long ivl_stmt_delay_val(ivl_statement_t net)
{
assert(net->type_ == IVL_ST_DELAY);
return net->u_.delay_.delay_;
}
extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net)
{
switch (net->type_) {
case IVL_ST_DELAY:
return net->u_.delay_.stmt_;
case IVL_ST_WAIT:
return net->u_.wait_.stmt_;
case IVL_ST_WHILE:
return net->u_.while_.stmt_;
default:
assert(0);
}
return 0;
}
/* /*
* $Log: t-dll-api.cc,v $ * $Log: t-dll-api.cc,v $
* Revision 1.2 2000/09/19 04:15:27 steve
* Introduce the means to get statement types.
*
* Revision 1.1 2000/09/18 01:24:32 steve * Revision 1.1 2000/09/18 01:24:32 steve
* Get the structure for ivl_statement_t worked out. * Get the structure for ivl_statement_t worked out.
* *

View File

@ -18,7 +18,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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: t-dll-proc.cc,v 1.1 2000/09/18 01:24:32 steve Exp $" #ident "$Id: t-dll-proc.cc,v 1.2 2000/09/19 04:15:27 steve Exp $"
#endif #endif
# include "target.h" # include "target.h"
@ -181,11 +181,27 @@ bool dll_target::proc_delay(const NetPDelay*net)
ivl_statement_t save_cur_ = stmt_cur_; ivl_statement_t save_cur_ = stmt_cur_;
stmt_cur_ = tmp; stmt_cur_ = tmp;
bool flag = net->emit_proc_recurse(this); bool flag = net->emit_proc_recurse(this);
/* If the recurse doesn't turn this new item into something,
then either it failed or there is no statement
there. Either way, draw a no-op into the statement. */
if (stmt_cur_->type_ == IVL_ST_NONE) {
stmt_cur_->type_ = IVL_ST_NOOP;
}
stmt_cur_ = save_cur_; stmt_cur_ = save_cur_;
return flag; return flag;
} }
void dll_target::proc_stask(const NetSTask*net)
{
assert(stmt_cur_);
assert(stmt_cur_->type_ == IVL_ST_NONE);
stmt_cur_->type_ = IVL_ST_STASK;
}
bool dll_target::proc_wait(const NetEvWait*net) bool dll_target::proc_wait(const NetEvWait*net)
{ {
assert(stmt_cur_); assert(stmt_cur_);
@ -198,6 +214,7 @@ bool dll_target::proc_wait(const NetEvWait*net)
ivl_statement_t save_cur_ = stmt_cur_; ivl_statement_t save_cur_ = stmt_cur_;
stmt_cur_ = stmt_cur_->u_.wait_.stmt_; stmt_cur_ = stmt_cur_->u_.wait_.stmt_;
bool flag = net->emit_recurse(this); bool flag = net->emit_recurse(this);
stmt_cur_ = save_cur_;
return flag; return flag;
} }
@ -225,6 +242,9 @@ void dll_target::proc_while(const NetWhile*net)
/* /*
* $Log: t-dll-proc.cc,v $ * $Log: t-dll-proc.cc,v $
* Revision 1.2 2000/09/19 04:15:27 steve
* Introduce the means to get statement types.
*
* Revision 1.1 2000/09/18 01:24:32 steve * Revision 1.1 2000/09/18 01:24:32 steve
* Get the structure for ivl_statement_t worked out. * Get the structure for ivl_statement_t worked out.
* *

18
t-dll.h
View File

@ -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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: t-dll.h,v 1.1 2000/09/18 01:24:32 steve Exp $" #ident "$Id: t-dll.h,v 1.2 2000/09/19 04:15:27 steve Exp $"
#endif #endif
# include "target.h" # include "target.h"
@ -72,6 +72,7 @@ struct dll_target : public target_t {
bool proc_block(const NetBlock*); bool proc_block(const NetBlock*);
void proc_condit(const NetCondit*); void proc_condit(const NetCondit*);
bool proc_delay(const NetPDelay*); bool proc_delay(const NetPDelay*);
void proc_stask(const NetSTask*);
bool proc_wait(const NetEvWait*); bool proc_wait(const NetEvWait*);
void proc_while(const NetWhile*); void proc_while(const NetWhile*);
}; };
@ -100,18 +101,6 @@ struct ivl_process_s {
* is defined by the ivl_statement_type_t enumeration. Given the type, * is defined by the ivl_statement_type_t enumeration. Given the type,
* certain information about the statement may be available. * certain information about the statement may be available.
*/ */
typedef enum ivl_statement_type_e {
IVL_ST_NONE = 0,
IVL_ST_NOOP = 1,
IVL_ST_ASSIGN,
IVL_ST_BLOCK,
IVL_ST_CONDIT,
IVL_ST_DELAY,
IVL_ST_DELAYX,
IVL_ST_WAIT,
IVL_ST_WHILE
} ivl_statement_type_t;
struct ivl_statement_s { struct ivl_statement_s {
enum ivl_statement_type_e type_; enum ivl_statement_type_e type_;
union { union {
@ -148,6 +137,9 @@ struct ivl_statement_s {
/* /*
* $Log: t-dll.h,v $ * $Log: t-dll.h,v $
* Revision 1.2 2000/09/19 04:15:27 steve
* Introduce the means to get statement types.
*
* Revision 1.1 2000/09/18 01:24:32 steve * Revision 1.1 2000/09/18 01:24:32 steve
* Get the structure for ivl_statement_t worked out. * Get the structure for ivl_statement_t worked out.
* *

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
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: stub.c,v 1.7 2000/09/18 01:24:32 steve Exp $" #ident "$Id: stub.c,v 1.8 2000/09/19 04:15:27 steve Exp $"
#endif #endif
/* /*
@ -78,11 +78,11 @@ int target_net_logic(const char*name, ivl_net_logic_t net)
unsigned npins, idx; unsigned npins, idx;
switch (ivl_get_logic_type(net)) { switch (ivl_get_logic_type(net)) {
case IVL_AND: case IVL_LO_AND:
fprintf(out, " and %s (%s", name, fprintf(out, " and %s (%s", name,
ivl_get_nexus_name(ivl_get_logic_pin(net, 0))); ivl_get_nexus_name(ivl_get_logic_pin(net, 0)));
break; break;
case IVL_OR: case IVL_LO_OR:
fprintf(out, " or %s (%s", name, fprintf(out, " or %s (%s", name,
ivl_get_nexus_name(ivl_get_logic_pin(net, 0))); ivl_get_nexus_name(ivl_get_logic_pin(net, 0)));
break; break;
@ -113,6 +113,73 @@ int target_net_signal(const char*name, ivl_net_signal_t net)
return 0; return 0;
} }
static void show_statement(ivl_statement_t net, unsigned ind)
{
const ivl_statement_type_t code = ivl_statement_type(net);
switch (code) {
case IVL_ST_ASSIGN:
fprintf(out, "%*s? = ?;\n", ind, "");
break;
case IVL_ST_BLOCK: {
unsigned cnt = ivl_stmt_block_count(net);
unsigned idx;
fprintf(out, "%*sbegin\n", ind, "");
for (idx = 0 ; idx < cnt ; idx += 1) {
ivl_statement_t cur = ivl_stmt_block_stmt(net, idx);
show_statement(cur, ind+4);
}
fprintf(out, "%*send\n", ind, "");
break;
}
case IVL_ST_CONDIT: {
ivl_statement_t t = ivl_stmt_cond_true(net);
ivl_statement_t f = ivl_stmt_cond_false(net);
fprintf(out, "%*sif (...)\n", ind, "");
if (t)
show_statement(t, ind+4);
else
fprintf(out, "%*s;\n", ind+4, "");
if (f) {
fprintf(out, "%*selse\n", ind, "");
show_statement(f, ind+4);
}
break;
}
case IVL_ST_DELAY:
fprintf(out, "%*s#%lu\n", ind, "", ivl_stmt_delay_val(net));
show_statement(ivl_stmt_sub_stmt(net), ind+2);
break;
case IVL_ST_NOOP:
fprintf(out, "%*s/* noop */;\n", ind, "");
break;
case IVL_ST_STASK:
fprintf(out, "%*s$?(...);\n", ind, "");
break;
case IVL_ST_WAIT:
fprintf(out, "%*s@(...)\n", ind, "");
show_statement(ivl_stmt_sub_stmt(net), ind+2);
break;
case IVL_ST_WHILE:
fprintf(out, "%*swhile (<?>)\n", ind, "");
show_statement(ivl_stmt_sub_stmt(net), ind+2);
break;
default:
fprintf(out, "%*sunknown statement type (%u)\n", ind, "", code);
}
}
int target_process(ivl_process_t net) int target_process(ivl_process_t net)
{ {
switch (ivl_get_process_type(net)) { switch (ivl_get_process_type(net)) {
@ -124,12 +191,16 @@ int target_process(ivl_process_t net)
break; break;
} }
fprintf(out, " STUB: process\n"); show_statement(ivl_get_process_stmt(net), 8);
return 0; return 0;
} }
/* /*
* $Log: stub.c,v $ * $Log: stub.c,v $
* Revision 1.8 2000/09/19 04:15:27 steve
* Introduce the means to get statement types.
*
* Revision 1.7 2000/09/18 01:24:32 steve * Revision 1.7 2000/09/18 01:24:32 steve
* Get the structure for ivl_statement_t worked out. * Get the structure for ivl_statement_t worked out.
* *