API for concatenation expressions.

This commit is contained in:
steve 2000-10-28 22:32:34 +00:00
parent 10fbb2a1bb
commit d6efae4bdd
7 changed files with 136 additions and 12 deletions

View File

@ -16,6 +16,9 @@ ivl_expr_opcode
ivl_expr_oper1 ivl_expr_oper1
ivl_expr_oper2 ivl_expr_oper2
ivl_expr_oper3 ivl_expr_oper3
ivl_expr_parm
ivl_expr_parms
ivl_expr_repeat
ivl_expr_signed ivl_expr_signed
ivl_expr_string ivl_expr_string
ivl_expr_width ivl_expr_width

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.24 2000/10/28 17:55:03 steve Exp $" #ident "$Id: ivl_target.h,v 1.25 2000/10/28 22:32:34 steve Exp $"
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
@ -258,12 +258,30 @@ extern ivl_nexus_t ivl_const_pin(ivl_net_const_t net, unsigned idx);
extern unsigned ivl_const_pins(ivl_net_const_t net); extern unsigned ivl_const_pins(ivl_net_const_t net);
extern int ivl_const_signed(ivl_net_const_t net); extern int ivl_const_signed(ivl_net_const_t net);
/* EXPRESSION /* EXPRESSIONS
*
* These methods operate on expression objects from the * These methods operate on expression objects from the
* design. Expressions mainly exist in behavioral code. The * design. Expressions mainly exist in behavioral code. The
* ivl_expr_type() function returns the type of the expression node, * ivl_expr_type() function returns the type of the expression node,
* and the remaining functions access value bits of the expression. * and the remaining functions access value bits of the expression.
*
* ivl_expr_signed
* This method returns true (!= 0) if the expression node
* represents a signed expression. It is possible for sub-
* expressions to be unsigned even if a node is signed, but the
* IVL core figures all this out for you. At any rate, this method
* can be applied to any expression node.
*
* ivl_expr_type
* Get the type of the expression node. Every expression node has a
* type, which can affect how some of the other expression methods
* operate on the node
*
* ivl_expr_width
* This method returns the bit width of the expression at this
* node. It can be applied to any expression node.
*/ */
extern ivl_expr_type_t ivl_expr_type(ivl_expr_t net); extern ivl_expr_type_t ivl_expr_type(ivl_expr_t net);
/* IVL_EX_NUMBER */ /* IVL_EX_NUMBER */
@ -278,6 +296,12 @@ 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_oper2(ivl_expr_t net);
/* */ /* */
extern ivl_expr_t ivl_expr_oper3(ivl_expr_t net); extern ivl_expr_t ivl_expr_oper3(ivl_expr_t net);
/* IVL_EX_CONCAT */
extern ivl_expr_t ivl_expr_parm(ivl_expr_t net, unsigned idx);
/* IVL_EX_CONCAT */
extern unsigned ivl_expr_parms(ivl_expr_t net);
/* IVL_EX_CONCAT */
extern unsigned ivl_expr_repeat(ivl_expr_t net);
/* any expression */ /* any expression */
extern int ivl_expr_signed(ivl_expr_t net); extern int ivl_expr_signed(ivl_expr_t net);
/* IVL_EX_STRING */ /* IVL_EX_STRING */
@ -524,6 +548,9 @@ _END_DECL
/* /*
* $Log: ivl_target.h,v $ * $Log: ivl_target.h,v $
* Revision 1.25 2000/10/28 22:32:34 steve
* API for concatenation expressions.
*
* Revision 1.24 2000/10/28 17:55:03 steve * Revision 1.24 2000/10/28 17:55:03 steve
* stub for the concat operator. * stub for the concat operator.
* *

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.15 2000/10/25 05:41:24 steve Exp $" #ident "$Id: t-dll-api.cc,v 1.16 2000/10/28 22:32:34 steve Exp $"
#endif #endif
# include "t-dll.h" # include "t-dll.h"
@ -152,6 +152,39 @@ extern "C" ivl_expr_t ivl_expr_oper3(ivl_expr_t net)
return 0; return 0;
} }
extern "C" ivl_expr_t ivl_expr_parm(ivl_expr_t net, unsigned idx)
{
assert(net);
switch (net->type_) {
case IVL_EX_CONCAT:
assert(idx < net->u_.concat_.parms);
return net->u_.concat_.parm[idx];
default:
assert(0);
return 0;
}
}
extern "C" unsigned ivl_expr_parms(ivl_expr_t net)
{
assert(net);
switch (net->type_) {
case IVL_EX_CONCAT:
return net->u_.concat_.parms;
default:
assert(0);
return 0;
}
}
extern "C" unsigned ivl_expr_repeat(ivl_expr_t net)
{
assert(net);
assert(net->type_ == IVL_EX_CONCAT);
return net->u_.concat_.rept;
}
extern "C" int ivl_expr_signed(ivl_expr_t net) extern "C" int ivl_expr_signed(ivl_expr_t net)
{ {
assert(net); assert(net);
@ -503,6 +536,9 @@ extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net)
/* /*
* $Log: t-dll-api.cc,v $ * $Log: t-dll-api.cc,v $
* Revision 1.16 2000/10/28 22:32:34 steve
* API for concatenation expressions.
*
* Revision 1.15 2000/10/25 05:41:24 steve * Revision 1.15 2000/10/25 05:41:24 steve
* Get target signal from nexus_ptr. * Get target signal from nexus_ptr.
* *

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-expr.cc,v 1.6 2000/10/28 17:55:03 steve Exp $" #ident "$Id: t-dll-expr.cc,v 1.7 2000/10/28 22:32:34 steve Exp $"
#endif #endif
# include "t-dll.h" # include "t-dll.h"
@ -59,11 +59,24 @@ void dll_target::expr_concat(const NetEConcat*net)
{ {
assert(expr_ == 0); assert(expr_ == 0);
expr_ = new struct ivl_expr_s; ivl_expr_t cur = new struct ivl_expr_s;
assert(expr_); assert(cur);
expr_->type_ = IVL_EX_CONCAT; cur->type_ = IVL_EX_CONCAT;
expr_->width_= net->expr_width(); cur->width_= net->expr_width();
cur->u_.concat_.rept = net->repeat();
cur->u_.concat_.parms = net->nparms();
cur->u_.concat_.parm = new ivl_expr_t [net->nparms()];
for (unsigned idx = 0 ; idx < net->nparms() ; idx += 1) {
expr_ = 0;
net->parm(idx)->expr_scan(this);
assert(expr_);
cur->u_.concat_.parm[idx] = expr_;
}
expr_ = cur;
} }
void dll_target::expr_const(const NetEConst*net) void dll_target::expr_const(const NetEConst*net)
@ -133,6 +146,9 @@ void dll_target::expr_signal(const NetESignal*net)
/* /*
* $Log: t-dll-expr.cc,v $ * $Log: t-dll-expr.cc,v $
* Revision 1.7 2000/10/28 22:32:34 steve
* API for concatenation expressions.
*
* Revision 1.6 2000/10/28 17:55:03 steve * Revision 1.6 2000/10/28 17:55:03 steve
* stub for the concat operator. * stub for the concat operator.
* *

11
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.16 2000/10/28 17:55:03 steve Exp $" #ident "$Id: t-dll.h,v 1.17 2000/10/28 22:32:34 steve Exp $"
#endif #endif
# include "target.h" # include "target.h"
@ -108,6 +108,12 @@ struct ivl_expr_s {
ivl_expr_t rig_; ivl_expr_t rig_;
} binary_; } binary_;
struct {
unsigned rept :16;
unsigned parms :16;
ivl_expr_t*parm;
} concat_;
struct { struct {
char*bits_; char*bits_;
} number_; } number_;
@ -311,6 +317,9 @@ struct ivl_statement_s {
/* /*
* $Log: t-dll.h,v $ * $Log: t-dll.h,v $
* Revision 1.17 2000/10/28 22:32:34 steve
* API for concatenation expressions.
*
* Revision 1.16 2000/10/28 17:55:03 steve * Revision 1.16 2000/10/28 17:55:03 steve
* stub for the concat operator. * stub for the concat operator.
* *

View File

@ -28,3 +28,29 @@ The target module API is defined in the ivl_target.h header file. This
declares all the type and functions that a loadable module needs to declares all the type and functions that a loadable module needs to
access the design. access the design.
ABOUT SPECIFIC EXPRESSION TYPES
In this section find notes about the various kinds of expression
nodes. The notes here are in addition to the more generation
documentation in the ivl_target.h header file.
* IVL_EX_CONCAT
The concatenation operator forms an expression node that holds the
repeat count and all the parameter expressions. The repeat count is
an integer that is calculated by the core compiler so it fully
evaluated, and *not* an expression.
The parameter expressions are retrieved by the ivl_expr_parm method,
with the index increasing as parameters go from left to right, from
most significant to least significant. (Note that this is different
from the order of bits within an expression node.)
* IVL_EX_NUMBER
This is a constant number. The width is fully know, and the bit
values are all represented by the ascii characters 0, 1, x or z. The
ivl_expr_bits method returns a pointer to the least significant bit,
and the remaining bits are ordered from least significant to most
significant. For example, 5'b1zzx0 is the 5 character string "0xzz1".

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.22 2000/10/28 17:55:03 steve Exp $" #ident "$Id: stub.c,v 1.23 2000/10/28 22:32:34 steve Exp $"
#endif #endif
/* /*
@ -34,6 +34,7 @@ static FILE*out;
static void show_expression(ivl_expr_t net, unsigned ind) static void show_expression(ivl_expr_t net, unsigned ind)
{ {
unsigned idx;
const ivl_expr_type_t code = ivl_expr_type(net); const ivl_expr_type_t code = ivl_expr_type(net);
unsigned width = ivl_expr_width(net); unsigned width = ivl_expr_width(net);
const char*sign = ivl_expr_signed(net)? "signed" : "unsigned"; const char*sign = ivl_expr_signed(net)? "signed" : "unsigned";
@ -48,12 +49,15 @@ static void show_expression(ivl_expr_t net, unsigned ind)
break; break;
case IVL_EX_CONCAT: case IVL_EX_CONCAT:
fprintf(out, "%*s<concat width=%u, %s>\n", ind, "", width, sign); fprintf(out, "%*s<concat repeat=%u, width=%u, %s>\n", ind, "",
ivl_expr_repeat(net), width, sign);
for (idx = 0 ; idx < ivl_expr_parms(net) ; idx += 1)
show_expression(ivl_expr_parm(net, idx), ind+3);
break; break;
case IVL_EX_NUMBER: { case IVL_EX_NUMBER: {
const char*bits = ivl_expr_bits(net); const char*bits = ivl_expr_bits(net);
unsigned idx;
fprintf(out, "%*s<number=%u'b", ind, "", width); fprintf(out, "%*s<number=%u'b", ind, "", width);
for (idx = width ; idx > 0 ; idx -= 1) for (idx = width ; idx > 0 ; idx -= 1)
@ -336,6 +340,9 @@ DECLARE_CYGWIN_DLL(DllMain);
/* /*
* $Log: stub.c,v $ * $Log: stub.c,v $
* Revision 1.23 2000/10/28 22:32:34 steve
* API for concatenation expressions.
*
* Revision 1.22 2000/10/28 17:55:03 steve * Revision 1.22 2000/10/28 17:55:03 steve
* stub for the concat operator. * stub for the concat operator.
* *