ivl_expr_t support for binary operators,
Create a proper ivl_scope_t object.
This commit is contained in:
parent
40028f263f
commit
c12e0f5416
12
ivl_target.h
12
ivl_target.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: ivl_target.h,v 1.13 2000/09/26 00:30:07 steve Exp $"
|
||||
#ident "$Id: ivl_target.h,v 1.14 2000/09/30 02:18:15 steve Exp $"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
@ -79,6 +79,7 @@ typedef struct ivl_statement_s*ivl_statement_t;
|
|||
/* This is the type of an ivl_expr_t object. */
|
||||
typedef enum ivl_expr_type_e {
|
||||
IVL_EX_NONE = 0,
|
||||
IVL_EX_BINARY,
|
||||
IVL_EX_NUMBER,
|
||||
IVL_EX_SIGNAL,
|
||||
IVL_EX_STRING,
|
||||
|
|
@ -177,6 +178,10 @@ extern ivl_expr_type_t ivl_expr_type(ivl_expr_t net);
|
|||
|
||||
extern const char* ivl_expr_bits(ivl_expr_t net);
|
||||
extern const char* ivl_expr_name(ivl_expr_t net);
|
||||
extern char ivl_expr_opcode(ivl_expr_t net);
|
||||
extern ivl_expr_t ivl_expr_oper1(ivl_expr_t net);
|
||||
extern ivl_expr_t ivl_expr_oper2(ivl_expr_t net);
|
||||
extern ivl_expr_t ivl_expr_oper3(ivl_expr_t net);
|
||||
extern int ivl_expr_signed(ivl_expr_t net);
|
||||
extern const char* ivl_expr_string(ivl_expr_t net);
|
||||
extern unsigned ivl_expr_width(ivl_expr_t net);
|
||||
|
|
@ -253,6 +258,7 @@ 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_expr_t ivl_stmt_cond_expr(ivl_statement_t net);
|
||||
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 */
|
||||
|
|
@ -372,6 +378,10 @@ _END_DECL
|
|||
|
||||
/*
|
||||
* $Log: ivl_target.h,v $
|
||||
* Revision 1.14 2000/09/30 02:18:15 steve
|
||||
* ivl_expr_t support for binary operators,
|
||||
* Create a proper ivl_scope_t object.
|
||||
*
|
||||
* Revision 1.13 2000/09/26 00:30:07 steve
|
||||
* Add EX_NUMBER and ST_TRIGGER to dll-api.
|
||||
*
|
||||
|
|
|
|||
57
t-dll-api.cc
57
t-dll-api.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: t-dll-api.cc,v 1.7 2000/09/26 00:30:07 steve Exp $"
|
||||
#ident "$Id: t-dll-api.cc,v 1.8 2000/09/30 02:18:15 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "t-dll.h"
|
||||
|
|
@ -33,12 +33,12 @@ extern "C" ivl_expr_type_t ivl_expr_type(ivl_expr_t net)
|
|||
|
||||
extern "C" const char*ivl_get_flag(ivl_design_t des, const char*key)
|
||||
{
|
||||
return ((const Design*)des)->get_flag(key).c_str();
|
||||
return des->self->get_flag(key).c_str();
|
||||
}
|
||||
|
||||
extern "C" const char*ivl_get_root_name(ivl_design_t des)
|
||||
{
|
||||
return ((const Design*)des)->find_root_scope()->name().c_str();
|
||||
return des->root_->self->basename();
|
||||
}
|
||||
|
||||
extern "C" const char* ivl_expr_bits(ivl_expr_t net)
|
||||
|
|
@ -53,6 +53,47 @@ extern "C" const char* ivl_expr_name(ivl_expr_t net)
|
|||
return net->u_.subsig_.name_;
|
||||
}
|
||||
|
||||
extern "C" char ivl_expr_opcode(ivl_expr_t net)
|
||||
{
|
||||
assert(net);
|
||||
switch (net->type_) {
|
||||
case IVL_EX_BINARY:
|
||||
return net->u_.binary_.op_;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" ivl_expr_t ivl_expr_oper1(ivl_expr_t net)
|
||||
{
|
||||
assert(net);
|
||||
switch (net->type_) {
|
||||
case IVL_EX_BINARY:
|
||||
return net->u_.binary_.lef_;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" ivl_expr_t ivl_expr_oper2(ivl_expr_t net)
|
||||
{
|
||||
assert(net);
|
||||
switch (net->type_) {
|
||||
case IVL_EX_BINARY:
|
||||
return net->u_.binary_.rig_;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int ivl_expr_signed(ivl_expr_t net)
|
||||
{
|
||||
assert(net);
|
||||
|
|
@ -197,6 +238,12 @@ extern "C" ivl_statement_t ivl_stmt_block_stmt(ivl_statement_t net,
|
|||
return net->u_.block_.stmt_ + i;
|
||||
}
|
||||
|
||||
extern "C" ivl_expr_t ivl_stmt_cond_expr(ivl_statement_t net)
|
||||
{
|
||||
assert(net && (net->type_ == IVL_ST_CONDIT));
|
||||
return net->u_.condit_.cond_;
|
||||
}
|
||||
|
||||
extern "C" ivl_statement_t ivl_stmt_cond_false(ivl_statement_t net)
|
||||
{
|
||||
assert(net->type_ == IVL_ST_CONDIT);
|
||||
|
|
@ -275,6 +322,10 @@ extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net)
|
|||
|
||||
/*
|
||||
* $Log: t-dll-api.cc,v $
|
||||
* Revision 1.8 2000/09/30 02:18:15 steve
|
||||
* ivl_expr_t support for binary operators,
|
||||
* Create a proper ivl_scope_t object.
|
||||
*
|
||||
* Revision 1.7 2000/09/26 00:30:07 steve
|
||||
* Add EX_NUMBER and ST_TRIGGER to dll-api.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) & !defined(macintosh)
|
||||
#ident "$Id: t-dll-expr.cc,v 1.3 2000/09/26 00:30:07 steve Exp $"
|
||||
#ident "$Id: t-dll-expr.cc,v 1.4 2000/09/30 02:18:15 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "t-dll.h"
|
||||
|
|
@ -25,6 +25,36 @@
|
|||
# include <assert.h>
|
||||
# include <malloc.h>
|
||||
|
||||
/*
|
||||
* These methods implement the expression scan that generates the
|
||||
* ivl_expr_t representing the expression. Each method leaves the
|
||||
* expr_ member filled with the ivl_expr_t that represents it. Each
|
||||
* method expects that the expr_ member empty (0) when it starts.
|
||||
*/
|
||||
|
||||
|
||||
void dll_target::expr_binary(const NetEBinary*net)
|
||||
{
|
||||
assert(expr_ == 0);
|
||||
|
||||
net->left()->expr_scan(this);
|
||||
ivl_expr_t left = expr_;
|
||||
|
||||
expr_ = 0;
|
||||
net->right()->expr_scan(this);
|
||||
ivl_expr_t rght = expr_;
|
||||
|
||||
expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s));
|
||||
assert(expr_);
|
||||
|
||||
expr_->type_ = IVL_EX_BINARY;
|
||||
expr_->width_= net->expr_width();
|
||||
|
||||
expr_->u_.binary_.op_ = net->op();
|
||||
expr_->u_.binary_.lef_ = left;
|
||||
expr_->u_.binary_.rig_ = rght;
|
||||
}
|
||||
|
||||
void dll_target::expr_const(const NetEConst*net)
|
||||
{
|
||||
assert(expr_ == 0);
|
||||
|
|
@ -80,6 +110,10 @@ void dll_target::expr_signal(const NetESignal*net)
|
|||
|
||||
/*
|
||||
* $Log: t-dll-expr.cc,v $
|
||||
* Revision 1.4 2000/09/30 02:18:15 steve
|
||||
* ivl_expr_t support for binary operators,
|
||||
* Create a proper ivl_scope_t object.
|
||||
*
|
||||
* Revision 1.3 2000/09/26 00:30:07 steve
|
||||
* Add EX_NUMBER and ST_TRIGGER to dll-api.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: t-dll-proc.cc,v 1.5 2000/09/26 00:30:07 steve Exp $"
|
||||
#ident "$Id: t-dll-proc.cc,v 1.6 2000/09/30 02:18:15 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "target.h"
|
||||
|
|
@ -148,6 +148,11 @@ void dll_target::proc_condit(const NetCondit*net)
|
|||
stmt_cur_->u_.condit_.stmt_ = (struct ivl_statement_s*)
|
||||
calloc(2, sizeof(struct ivl_statement_s));
|
||||
|
||||
assert(expr_ == 0);
|
||||
net->expr()->expr_scan(this);
|
||||
stmt_cur_->u_.condit_.cond_ = expr_;
|
||||
expr_ = 0;
|
||||
|
||||
ivl_statement_t save_cur_ = stmt_cur_;
|
||||
|
||||
stmt_cur_ = save_cur_->u_.condit_.stmt_+0;
|
||||
|
|
@ -263,6 +268,10 @@ void dll_target::proc_while(const NetWhile*net)
|
|||
|
||||
/*
|
||||
* $Log: t-dll-proc.cc,v $
|
||||
* Revision 1.6 2000/09/30 02:18:15 steve
|
||||
* ivl_expr_t support for binary operators,
|
||||
* Create a proper ivl_scope_t object.
|
||||
*
|
||||
* Revision 1.5 2000/09/26 00:30:07 steve
|
||||
* Add EX_NUMBER and ST_TRIGGER to dll-api.
|
||||
*
|
||||
|
|
|
|||
53
t-dll.cc
53
t-dll.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: t-dll.cc,v 1.8 2000/09/24 15:46:00 steve Exp $"
|
||||
#ident "$Id: t-dll.cc,v 1.9 2000/09/30 02:18:15 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "compiler.h"
|
||||
|
|
@ -37,7 +37,10 @@ bool dll_target::start_design(const Design*des)
|
|||
|
||||
stmt_cur_ = 0;
|
||||
|
||||
des_ = (ivl_design_t)des;
|
||||
// Initialize the design object.
|
||||
des_.self = des;
|
||||
des_.root_ = (ivl_scope_t)calloc(1, sizeof(struct ivl_scope_s));
|
||||
des_.root_->self = des->find_root_scope();
|
||||
|
||||
start_design_ = (start_design_f)dlsym(dll_, "target_start_design");
|
||||
end_design_ = (end_design_f) dlsym(dll_, "target_end_design");
|
||||
|
|
@ -51,13 +54,13 @@ bool dll_target::start_design(const Design*des)
|
|||
process_ = (process_f) dlsym(dll_, LU "target_process" TU);
|
||||
scope_ = (scope_f) dlsym(dll_, LU "target_scope" TU);
|
||||
|
||||
(start_design_)(des_);
|
||||
(start_design_)(&des_);
|
||||
return true;
|
||||
}
|
||||
|
||||
void dll_target::end_design(const Design*)
|
||||
{
|
||||
(end_design_)(des_);
|
||||
(end_design_)(&des_);
|
||||
dlclose(dll_);
|
||||
}
|
||||
|
||||
|
|
@ -139,10 +142,46 @@ void dll_target::net_probe(const NetEvProbe*net)
|
|||
return;
|
||||
}
|
||||
|
||||
static ivl_scope_t find_scope(ivl_scope_t root, const NetScope*cur)
|
||||
{
|
||||
ivl_scope_t parent, tmp;
|
||||
|
||||
if (const NetScope*par = cur->parent()) {
|
||||
parent = find_scope(root, par);
|
||||
|
||||
} else {
|
||||
assert(root->self == cur);
|
||||
return root;
|
||||
}
|
||||
|
||||
for (tmp = parent->child_ ; tmp ; tmp = tmp->sibling_)
|
||||
if (tmp->self == cur)
|
||||
return tmp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dll_target::scope(const NetScope*net)
|
||||
{
|
||||
ivl_scope_t scope;
|
||||
|
||||
if (net->parent() == 0) {
|
||||
assert(des_.root_->self == net);
|
||||
scope = des_.root_;
|
||||
|
||||
} else {
|
||||
scope = (ivl_scope_t)calloc(1, sizeof(struct ivl_scope_s));
|
||||
scope->self = net;
|
||||
|
||||
ivl_scope_t parent = find_scope(des_.root_, net->parent());
|
||||
assert(parent != 0);
|
||||
|
||||
scope->sibling_= parent->child_;
|
||||
parent->child_ = scope;
|
||||
}
|
||||
|
||||
if (scope_)
|
||||
(scope_)( (ivl_scope_t)net );
|
||||
(scope_)(scope);
|
||||
}
|
||||
|
||||
void dll_target::signal(const NetNet*net)
|
||||
|
|
@ -163,6 +202,10 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj };
|
|||
|
||||
/*
|
||||
* $Log: t-dll.cc,v $
|
||||
* Revision 1.9 2000/09/30 02:18:15 steve
|
||||
* ivl_expr_t support for binary operators,
|
||||
* Create a proper ivl_scope_t object.
|
||||
*
|
||||
* Revision 1.8 2000/09/24 15:46:00 steve
|
||||
* API access to signal type and port type.
|
||||
*
|
||||
|
|
|
|||
29
t-dll.h
29
t-dll.h
|
|
@ -19,12 +19,17 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: t-dll.h,v 1.6 2000/09/26 00:30:07 steve Exp $"
|
||||
#ident "$Id: t-dll.h,v 1.7 2000/09/30 02:18:15 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "target.h"
|
||||
# include "ivl_target.h"
|
||||
|
||||
struct ivl_design_s {
|
||||
ivl_scope_t root_;
|
||||
const Design*self;
|
||||
};
|
||||
|
||||
/*
|
||||
* The DLL target type loads a named object file to handle the process
|
||||
* of scanning the netlist. When it is time to start the design, I
|
||||
|
|
@ -50,7 +55,7 @@ struct dll_target : public target_t, public expr_scan_t {
|
|||
void*dll_;
|
||||
string dll_path_;
|
||||
|
||||
ivl_design_t des_;
|
||||
ivl_design_s des_;
|
||||
|
||||
start_design_f start_design_;
|
||||
end_design_f end_design_;
|
||||
|
|
@ -78,6 +83,7 @@ struct dll_target : public target_t, public expr_scan_t {
|
|||
void proc_while(const NetWhile*);
|
||||
|
||||
struct ivl_expr_s*expr_;
|
||||
void expr_binary(const NetEBinary*);
|
||||
void expr_const(const NetEConst*);
|
||||
void expr_signal(const NetESignal*);
|
||||
};
|
||||
|
|
@ -99,6 +105,12 @@ struct ivl_expr_s {
|
|||
unsigned signed_ : 1;
|
||||
|
||||
union {
|
||||
struct {
|
||||
char op_;
|
||||
ivl_expr_t lef_;
|
||||
ivl_expr_t rig_;
|
||||
} binary_;
|
||||
|
||||
struct {
|
||||
char*bits_;
|
||||
} number_;
|
||||
|
|
@ -128,6 +140,12 @@ struct ivl_process_s {
|
|||
ivl_statement_t stmt_;
|
||||
};
|
||||
|
||||
struct ivl_scope_s {
|
||||
ivl_scope_t child_, sibling_;
|
||||
|
||||
const NetScope*self;
|
||||
};
|
||||
|
||||
/*
|
||||
* The ivl_statement_t represents any statement. The type of statement
|
||||
* is defined by the ivl_statement_type_t enumeration. Given the type,
|
||||
|
|
@ -142,6 +160,9 @@ struct ivl_statement_s {
|
|||
} block_;
|
||||
|
||||
struct { /* IVL_ST_CONDIT */
|
||||
/* This is the condition expression */
|
||||
ivl_expr_t cond_;
|
||||
/* This is two statements, the true and false. */
|
||||
struct ivl_statement_s*stmt_;
|
||||
} condit_;
|
||||
|
||||
|
|
@ -179,6 +200,10 @@ struct ivl_statement_s {
|
|||
|
||||
/*
|
||||
* $Log: t-dll.h,v $
|
||||
* Revision 1.7 2000/09/30 02:18:15 steve
|
||||
* ivl_expr_t support for binary operators,
|
||||
* Create a proper ivl_scope_t object.
|
||||
*
|
||||
* Revision 1.6 2000/09/26 00:30:07 steve
|
||||
* Add EX_NUMBER and ST_TRIGGER to dll-api.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: verilog.c,v 1.4 2000/09/26 00:30:07 steve Exp $"
|
||||
#ident "$Id: verilog.c,v 1.5 2000/09/30 02:18:15 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -109,7 +109,19 @@ int target_net_probe(const char*name, ivl_net_probe_t net)
|
|||
|
||||
int target_net_signal(const char*name, ivl_signal_t net)
|
||||
{
|
||||
fprintf(out, "STUB: %s: signal [%u]\n", name, ivl_signal_pins(net));
|
||||
unsigned cnt = ivl_signal_pins(net);
|
||||
|
||||
switch (ivl_signal_type(net)) {
|
||||
|
||||
case IVL_SIT_WIRE:
|
||||
fprintf(out, " wire [%u:0] %s;\n", cnt-1, name);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(out, " <huh!?> [%u:0] %s;\n", cnt-1, name);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -120,6 +132,13 @@ static void show_expression(ivl_expr_t net)
|
|||
|
||||
switch (ivl_expr_type(net)) {
|
||||
|
||||
case IVL_EX_BINARY: {
|
||||
show_expression(ivl_expr_oper1(net));
|
||||
fprintf(out, "%c", ivl_expr_opcode(net));
|
||||
show_expression(ivl_expr_oper2(net));
|
||||
break;
|
||||
}
|
||||
|
||||
case IVL_EX_NUMBER: {
|
||||
int sigflag = ivl_expr_signed(net);
|
||||
unsigned idx, width = ivl_expr_width(net);
|
||||
|
|
@ -169,7 +188,10 @@ static void show_statement(ivl_statement_t net, unsigned ind)
|
|||
ivl_statement_t t = ivl_stmt_cond_true(net);
|
||||
ivl_statement_t f = ivl_stmt_cond_false(net);
|
||||
|
||||
fprintf(out, "%*sif (...)\n", ind, "");
|
||||
fprintf(out, "%*sif (", ind, "");
|
||||
show_expression(ivl_stmt_cond_expr(net));
|
||||
fprintf(out, ")\n");
|
||||
|
||||
if (t)
|
||||
show_statement(t, ind+4);
|
||||
else
|
||||
|
|
@ -241,6 +263,10 @@ int target_process(ivl_process_t net)
|
|||
|
||||
/*
|
||||
* $Log: verilog.c,v $
|
||||
* Revision 1.5 2000/09/30 02:18:15 steve
|
||||
* ivl_expr_t support for binary operators,
|
||||
* Create a proper ivl_scope_t object.
|
||||
*
|
||||
* Revision 1.4 2000/09/26 00:30:07 steve
|
||||
* Add EX_NUMBER and ST_TRIGGER to dll-api.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue