2000-08-12 18:34:37 +02:00
|
|
|
#ifndef __ivl_target_H
|
|
|
|
|
#define __ivl_target_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) && !defined(macintosh)
|
2001-07-22 02:17:49 +02:00
|
|
|
#ident "$Id: ivl_target.h,v 1.73 2001/07/22 00:17:49 steve Exp $"
|
2000-08-12 18:34:37 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
#define _BEGIN_DECL extern "C" {
|
|
|
|
|
#define _END_DECL }
|
|
|
|
|
#else
|
|
|
|
|
#define _BEGIN_DECL
|
|
|
|
|
#define _END_DECL
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_BEGIN_DECL
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This header file describes the API for the loadable target
|
|
|
|
|
* module. The main program can load these modules and access the
|
|
|
|
|
* functions within the loaded module to implement the backend
|
|
|
|
|
* behavior.
|
2000-08-20 06:13:56 +02:00
|
|
|
*
|
|
|
|
|
* The interface is divided into two parts: the entry points within
|
2000-09-19 06:15:27 +02:00
|
|
|
* the core that are called by the module, and the entry points in
|
2000-08-20 06:13:56 +02:00
|
|
|
* 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
|
|
|
|
|
* interesting information about the design is accessed through the
|
|
|
|
|
* various access functions that the modules calls into the core.
|
2000-08-12 18:34:37 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
2000-08-20 06:13:56 +02:00
|
|
|
/*
|
|
|
|
|
* In order to grab onto data in the design, the core passes cookies
|
|
|
|
|
* to the various functions of the module. These cookies can in turn
|
|
|
|
|
* be passed to access functions in the core to get more detailed
|
|
|
|
|
* information.
|
|
|
|
|
*
|
|
|
|
|
* The following typedefs list the various cookies that may be passed
|
|
|
|
|
* around.
|
2000-10-05 07:03:01 +02:00
|
|
|
*
|
|
|
|
|
* ivl_design_t
|
|
|
|
|
* This object represents the entire elaborated design. Various
|
|
|
|
|
* global properties and methods are available from this.
|
|
|
|
|
*
|
2001-03-28 08:07:39 +02:00
|
|
|
* ivl_event_t
|
|
|
|
|
* This object represents an event node. An event node stands for
|
|
|
|
|
* named events written explicitly in the Verilog, and net events
|
|
|
|
|
* that are implicit when @ statements are used.
|
|
|
|
|
*
|
2000-10-05 07:03:01 +02:00
|
|
|
* ivl_expr_t
|
|
|
|
|
* This object represents a node of an expression. If the
|
|
|
|
|
* expression has sub-expressions, they can be accessed from
|
|
|
|
|
* various method described below. The ivl_expr_type method in
|
|
|
|
|
* particular gets the type of the node in the form of an
|
|
|
|
|
* ivl_expr_type_t enumeration value.
|
|
|
|
|
*
|
|
|
|
|
* Objects of this type represent expressions in
|
|
|
|
|
* processes. Structural expressions are instead treated as logic
|
|
|
|
|
* gates.
|
|
|
|
|
*
|
2000-11-11 01:03:36 +01:00
|
|
|
* ivl_lpm_t
|
|
|
|
|
* This object is the base class for all the various LPM type
|
|
|
|
|
* device nodes. This object carries a few base properties
|
|
|
|
|
* (including a type) including a handle to the specific type.
|
|
|
|
|
*
|
2000-10-07 21:45:42 +02:00
|
|
|
* ivl_net_logic_t
|
|
|
|
|
* This object represents various built in logic devices. In fact,
|
|
|
|
|
* this includes just about every directional device that has a
|
|
|
|
|
* single output, including logic gates and nmos, pmos and cmon
|
|
|
|
|
* devices. There is also the occasional Icarus Verilog creation.
|
|
|
|
|
*
|
2000-10-15 06:46:23 +02:00
|
|
|
* ivl_nexus_t
|
|
|
|
|
* Structural links within an elaborated design are connected
|
|
|
|
|
* together at each bit. The connection point is a nexus, so pins
|
|
|
|
|
* of devices refer to an ivl_nexus_t. Furthermore, from a nexus
|
|
|
|
|
* there are backward references to all the device pins that point
|
|
|
|
|
* to it.
|
|
|
|
|
*
|
2000-10-05 07:03:01 +02:00
|
|
|
* ivl_process_t
|
|
|
|
|
* A Verilog process is represented by one of these. A process may
|
|
|
|
|
* be an "initial" or an "always" process. These come from initial
|
|
|
|
|
* or always statements from the verilog source.
|
|
|
|
|
*
|
|
|
|
|
* ivl_scope_t
|
2000-10-07 01:46:50 +02:00
|
|
|
* Elaborated scopes within a design are represented by this
|
|
|
|
|
* type. Objects of this type also act as containers for scoped
|
|
|
|
|
* objects such as signals.
|
2000-10-05 07:03:01 +02:00
|
|
|
*
|
|
|
|
|
* ivl_statement_t
|
|
|
|
|
* Statements within processes are represented by one of these. The
|
|
|
|
|
* ivl_process_t object holds one of these, but a statement may in
|
|
|
|
|
* turn contain other statements.
|
|
|
|
|
*
|
|
|
|
|
* -- A Note About Bit Sets --
|
|
|
|
|
* Some objects hold a value as an array of bits. In these cases there
|
|
|
|
|
* is some method that retrieves the width of the value and another
|
|
|
|
|
* that returns a "char*". The latter is a pointer to the least
|
|
|
|
|
* significant bit value. Bit values are represented by the characters
|
|
|
|
|
* '0', '1', 'x' and 'z'. Strengths are stored elsewhere.
|
2000-10-07 01:46:50 +02:00
|
|
|
*
|
|
|
|
|
* -- A Note About Names --
|
|
|
|
|
* The names of objects are complete, hierarchical names. That is,
|
|
|
|
|
* they include the instance name of the module that contains them.
|
2000-08-20 06:13:56 +02:00
|
|
|
*/
|
2000-10-05 07:03:01 +02:00
|
|
|
typedef struct ivl_design_s *ivl_design_t;
|
2001-03-28 08:07:39 +02:00
|
|
|
typedef struct ivl_event_s *ivl_event_t;
|
2000-09-23 07:15:07 +02:00
|
|
|
typedef struct ivl_expr_s *ivl_expr_t;
|
2000-11-11 01:03:36 +01:00
|
|
|
typedef struct ivl_lpm_s *ivl_lpm_t;
|
2000-10-18 22:04:39 +02:00
|
|
|
typedef struct ivl_lval_s *ivl_lval_t;
|
2000-08-14 06:39:56 +02:00
|
|
|
typedef struct ivl_net_const_s*ivl_net_const_t;
|
2000-08-19 20:12:42 +02:00
|
|
|
typedef struct ivl_net_logic_s*ivl_net_logic_t;
|
2001-04-23 01:09:45 +02:00
|
|
|
typedef struct ivl_udp_s *ivl_udp_t;
|
2000-08-19 20:12:42 +02:00
|
|
|
typedef struct ivl_net_probe_s*ivl_net_probe_t;
|
2000-08-26 02:54:03 +02:00
|
|
|
typedef struct ivl_nexus_s *ivl_nexus_t;
|
2000-10-15 06:46:23 +02:00
|
|
|
typedef struct ivl_nexus_ptr_s*ivl_nexus_ptr_t;
|
2000-08-14 06:39:56 +02:00
|
|
|
typedef struct ivl_process_s *ivl_process_t;
|
2000-08-19 20:12:42 +02:00
|
|
|
typedef struct ivl_scope_s *ivl_scope_t;
|
2000-09-24 17:46:00 +02:00
|
|
|
typedef struct ivl_signal_s *ivl_signal_t;
|
2001-05-06 19:48:20 +02:00
|
|
|
typedef struct ivl_memory_s *ivl_memory_t;
|
2000-09-18 03:24:32 +02:00
|
|
|
typedef struct ivl_statement_s*ivl_statement_t;
|
2000-08-19 20:12:42 +02:00
|
|
|
|
2000-09-19 06:15:27 +02:00
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
|
|
|
|
|
2001-04-30 01:17:38 +02:00
|
|
|
typedef enum ivl_drive_e {
|
|
|
|
|
IVL_DR_HiZ = 0,
|
|
|
|
|
IVL_DR_SMALL = 1,
|
|
|
|
|
IVL_DR_MEDIUM = 2,
|
|
|
|
|
IVL_DR_WEAK = 3,
|
|
|
|
|
IVL_DR_LARGE = 4,
|
|
|
|
|
IVL_DR_PULL = 5,
|
|
|
|
|
IVL_DR_STRONG = 6,
|
|
|
|
|
IVL_DR_SUPPLY = 7
|
|
|
|
|
} ivl_drive_t;
|
|
|
|
|
|
2000-09-24 17:46:00 +02:00
|
|
|
/* This is the type of an ivl_expr_t object. */
|
2000-09-23 07:15:07 +02:00
|
|
|
typedef enum ivl_expr_type_e {
|
|
|
|
|
IVL_EX_NONE = 0,
|
2001-07-22 02:17:49 +02:00
|
|
|
IVL_EX_BITSEL,
|
2000-09-30 04:18:15 +02:00
|
|
|
IVL_EX_BINARY,
|
2000-10-28 19:55:03 +02:00
|
|
|
IVL_EX_CONCAT,
|
2001-05-08 06:13:12 +02:00
|
|
|
IVL_EX_MEMORY,
|
2000-09-23 07:15:07 +02:00
|
|
|
IVL_EX_NUMBER,
|
2001-04-02 02:28:35 +02:00
|
|
|
IVL_EX_SCOPE,
|
2000-10-05 07:03:01 +02:00
|
|
|
IVL_EX_SFUNC,
|
2000-09-24 04:21:53 +02:00
|
|
|
IVL_EX_SIGNAL,
|
|
|
|
|
IVL_EX_STRING,
|
2001-05-17 06:37:02 +02:00
|
|
|
IVL_EX_TERNARY,
|
2001-04-06 04:28:02 +02:00
|
|
|
IVL_EX_UFUNC,
|
2001-04-15 04:58:11 +02:00
|
|
|
IVL_EX_ULONG,
|
2001-03-29 04:52:39 +02:00
|
|
|
IVL_EX_UNARY
|
2000-09-23 07:15:07 +02:00
|
|
|
} ivl_expr_type_t;
|
|
|
|
|
|
2000-09-24 17:46:00 +02:00
|
|
|
/* This is the type code for an ivl_net_logic_t object. */
|
2000-09-19 06:15:27 +02:00
|
|
|
typedef enum ivl_logic_e {
|
|
|
|
|
IVL_LO_NONE = 0,
|
|
|
|
|
IVL_LO_AND,
|
|
|
|
|
IVL_LO_BUF,
|
|
|
|
|
IVL_LO_BUFIF0,
|
|
|
|
|
IVL_LO_BUFIF1,
|
2000-10-07 21:45:42 +02:00
|
|
|
IVL_LO_BUFZ,
|
2000-09-19 06:15:27 +02:00
|
|
|
IVL_LO_NAND,
|
2000-11-11 02:52:09 +01:00
|
|
|
IVL_LO_NMOS,
|
2000-09-19 06:15:27 +02:00
|
|
|
IVL_LO_NOR,
|
|
|
|
|
IVL_LO_NOT,
|
|
|
|
|
IVL_LO_NOTIF0,
|
|
|
|
|
IVL_LO_NOTIF1,
|
|
|
|
|
IVL_LO_OR,
|
2001-04-29 22:19:10 +02:00
|
|
|
IVL_LO_PULLDOWN,
|
|
|
|
|
IVL_LO_PULLUP,
|
2000-11-11 02:52:09 +01:00
|
|
|
IVL_LO_RNMOS,
|
|
|
|
|
IVL_LO_RPMOS,
|
|
|
|
|
IVL_LO_PMOS,
|
2000-09-19 06:15:27 +02:00
|
|
|
IVL_LO_XNOR,
|
2001-04-23 01:09:45 +02:00
|
|
|
IVL_LO_XOR,
|
|
|
|
|
|
2001-06-19 05:01:10 +02:00
|
|
|
IVL_LO_EEQ,
|
|
|
|
|
|
2001-04-23 01:09:45 +02:00
|
|
|
IVL_LO_UDP
|
2000-09-19 06:15:27 +02:00
|
|
|
} ivl_logic_t;
|
|
|
|
|
|
2000-11-11 01:03:36 +01:00
|
|
|
/* This is the type of an LPM object. */
|
|
|
|
|
typedef enum ivl_lpm_type_e {
|
2001-06-07 04:12:43 +02:00
|
|
|
IVL_LPM_ADD,
|
2001-06-15 06:14:18 +02:00
|
|
|
IVL_LPM_CMP_GE,
|
|
|
|
|
IVL_LPM_CMP_GT,
|
2001-04-26 07:12:02 +02:00
|
|
|
IVL_LPM_FF,
|
2001-06-17 01:45:05 +02:00
|
|
|
IVL_LPM_MULT,
|
2001-06-07 05:09:37 +02:00
|
|
|
IVL_LPM_MUX,
|
2001-07-05 00:59:25 +02:00
|
|
|
IVL_LPM_SHIFTL,
|
|
|
|
|
IVL_LPM_SHIFTR,
|
2001-06-16 04:41:41 +02:00
|
|
|
IVL_LPM_SUB,
|
2001-06-17 01:45:05 +02:00
|
|
|
IVL_LPM_RAM
|
2000-11-11 01:03:36 +01:00
|
|
|
} ivl_lpm_type_t;
|
|
|
|
|
|
2000-09-24 17:46:00 +02:00
|
|
|
/* Processes are initial or always blocks with a statement. This is
|
|
|
|
|
the type of the ivl_process_t object. */
|
2000-09-19 06:15:27 +02:00
|
|
|
typedef enum ivl_process_type_e {
|
|
|
|
|
IVL_PR_INITIAL = 0,
|
|
|
|
|
IVL_PR_ALWAYS = 1
|
|
|
|
|
} ivl_process_type_t;
|
|
|
|
|
|
2001-01-15 01:47:01 +01:00
|
|
|
/* These are the sorts of reasons a scope may come to be. These types
|
|
|
|
|
are properties of ivl_scope_t objects. */
|
|
|
|
|
typedef enum ivl_scope_type_e {
|
|
|
|
|
IVL_SCT_MODULE = 0,
|
|
|
|
|
IVL_SCT_FUNCTION= 1,
|
|
|
|
|
IVL_SCT_TASK = 2,
|
|
|
|
|
IVL_SCT_BEGIN = 3,
|
|
|
|
|
IVL_SCT_FORK = 4
|
|
|
|
|
} ivl_scope_type_t;
|
|
|
|
|
|
2000-09-24 17:46:00 +02:00
|
|
|
/* Signals (ivl_signal_t) that are ports into the scope that contains
|
|
|
|
|
them have a port type. Otherwise, they are port IVL_SIP_NONE. */
|
|
|
|
|
typedef enum ivl_signal_port_e {
|
|
|
|
|
IVL_SIP_NONE = 0,
|
|
|
|
|
IVL_SIP_INPUT = 1,
|
|
|
|
|
IVL_SIP_OUTPUT= 2,
|
|
|
|
|
IVL_SIP_INOUT = 3
|
|
|
|
|
} ivl_signal_port_t;
|
|
|
|
|
|
|
|
|
|
/* This is the type code for an ivl_signal_t object. Implicit types
|
|
|
|
|
are resolved by the core compiler, and integers are converted into
|
|
|
|
|
signed registers. */
|
|
|
|
|
typedef enum ivl_signal_type_e {
|
|
|
|
|
IVL_SIT_NONE = 0,
|
|
|
|
|
IVL_SIT_REG,
|
|
|
|
|
IVL_SIT_SUPPLY0,
|
|
|
|
|
IVL_SIT_SUPPLY1,
|
|
|
|
|
IVL_SIT_TRI,
|
|
|
|
|
IVL_SIT_TRI0,
|
|
|
|
|
IVL_SIT_TRI1,
|
|
|
|
|
IVL_SIT_TRIAND,
|
|
|
|
|
IVL_SIT_TRIOR,
|
|
|
|
|
IVL_SIT_WAND,
|
|
|
|
|
IVL_SIT_WIRE,
|
|
|
|
|
IVL_SIT_WOR
|
|
|
|
|
} ivl_signal_type_t;
|
|
|
|
|
|
|
|
|
|
/* This is the type code for ivl_statement_t objects. */
|
2000-09-19 06:15:27 +02:00
|
|
|
typedef enum ivl_statement_type_e {
|
|
|
|
|
IVL_ST_NONE = 0,
|
|
|
|
|
IVL_ST_NOOP = 1,
|
|
|
|
|
IVL_ST_ASSIGN,
|
2001-04-03 06:50:37 +02:00
|
|
|
IVL_ST_ASSIGN_NB,
|
2000-09-19 06:15:27 +02:00
|
|
|
IVL_ST_BLOCK,
|
2001-03-31 19:36:38 +02:00
|
|
|
IVL_ST_CASE,
|
|
|
|
|
IVL_ST_CASEX,
|
|
|
|
|
IVL_ST_CASEZ,
|
2000-09-19 06:15:27 +02:00
|
|
|
IVL_ST_CONDIT,
|
|
|
|
|
IVL_ST_DELAY,
|
|
|
|
|
IVL_ST_DELAYX,
|
2001-04-07 21:24:36 +02:00
|
|
|
IVL_ST_DISABLE,
|
2001-04-04 06:50:35 +02:00
|
|
|
IVL_ST_FOREVER,
|
2001-03-30 07:49:52 +02:00
|
|
|
IVL_ST_FORK,
|
2001-04-05 05:20:57 +02:00
|
|
|
IVL_ST_REPEAT,
|
2000-09-19 06:15:27 +02:00
|
|
|
IVL_ST_STASK,
|
2000-09-26 02:30:07 +02:00
|
|
|
IVL_ST_TRIGGER,
|
2001-04-02 04:28:12 +02:00
|
|
|
IVL_ST_UTASK,
|
2000-09-19 06:15:27 +02:00
|
|
|
IVL_ST_WAIT,
|
|
|
|
|
IVL_ST_WHILE
|
|
|
|
|
} ivl_statement_type_t;
|
|
|
|
|
|
2000-10-15 06:46:23 +02:00
|
|
|
/* This is the type of the function to apply to a process. */
|
2001-01-15 01:05:39 +01:00
|
|
|
typedef int (*ivl_process_f)(ivl_process_t net, void*cd);
|
2000-08-12 18:34:37 +02:00
|
|
|
|
2001-01-15 01:05:39 +01:00
|
|
|
/* This is the type of a function to apply to a scope. The ivl_scope_t
|
|
|
|
|
parameter is the scope, and the cd parameter is client data that
|
|
|
|
|
the user passes to the scanner. */
|
|
|
|
|
typedef int (ivl_scope_f)(ivl_scope_t net, void*cd);
|
2000-08-19 20:12:42 +02:00
|
|
|
|
|
|
|
|
|
2000-10-15 06:46:23 +02:00
|
|
|
/* DESIGN
|
|
|
|
|
* When handed a design (ivl_design_t) there are a few things that you
|
|
|
|
|
* can do with it. The Verilog program has one design that carries the
|
|
|
|
|
* entire program. Use the design methods to iterate over the elements
|
|
|
|
|
* of the design.
|
|
|
|
|
*
|
|
|
|
|
* ivl_design_flag
|
|
|
|
|
* This function returns the string value of a named flag. Flags
|
|
|
|
|
* come from the "-fkey=value" options to the iverilog command and
|
|
|
|
|
* are stored in a map for this function. Given the key, this
|
|
|
|
|
* function returns the value.
|
|
|
|
|
*
|
|
|
|
|
* The special key "-o" is the argument to the -o flag of the
|
|
|
|
|
* command line (or the default if the -o flag is not used) and is
|
|
|
|
|
* generally how the target learns the name of the output file.
|
|
|
|
|
*
|
|
|
|
|
* ivl_design_process
|
|
|
|
|
* This function scans the processes (threads) in the design. It
|
|
|
|
|
* calls the user suplied function on each of the processes until
|
|
|
|
|
* one of the functors returns non-0 or all the processes are
|
|
|
|
|
* scanned. This function will return 0, or the non-zero value that
|
|
|
|
|
* was returned from the last scanned process.
|
|
|
|
|
*
|
|
|
|
|
* ivl_design_root
|
|
|
|
|
* A design has a root named scope that is an instance of the top
|
|
|
|
|
* level module in the design. This is a hook for naming the
|
|
|
|
|
* design, or for starting the scope scan.
|
2001-07-01 01:03:16 +02:00
|
|
|
*
|
|
|
|
|
* ivl_design_time_precision
|
|
|
|
|
* A design as a time precision. This is the size in seconds (a
|
|
|
|
|
* signed power of 10) of a simulation tick.
|
2000-10-15 06:46:23 +02:00
|
|
|
*/
|
2000-08-12 18:34:37 +02:00
|
|
|
|
2000-10-15 06:46:23 +02:00
|
|
|
extern const char* ivl_design_flag(ivl_design_t des, const char*key);
|
2001-01-15 01:05:39 +01:00
|
|
|
extern int ivl_design_process(ivl_design_t des,
|
|
|
|
|
ivl_process_f fun, void*cd);
|
2000-10-15 06:46:23 +02:00
|
|
|
extern ivl_scope_t ivl_design_root(ivl_design_t des);
|
2001-07-01 01:03:16 +02:00
|
|
|
extern int ivl_design_time_precision(ivl_design_t des);
|
2000-08-26 02:54:03 +02:00
|
|
|
|
2000-10-05 07:03:01 +02:00
|
|
|
/*
|
|
|
|
|
* These methods apply to ivl_net_const_t objects.
|
|
|
|
|
*/
|
|
|
|
|
extern const char* ivl_const_bits(ivl_net_const_t net);
|
|
|
|
|
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 int ivl_const_signed(ivl_net_const_t net);
|
|
|
|
|
|
2001-03-28 08:07:39 +02:00
|
|
|
/* EVENTS
|
|
|
|
|
*
|
|
|
|
|
* Events are a unification of named events and implicit events
|
|
|
|
|
* generated by the @ statements.
|
|
|
|
|
*
|
|
|
|
|
* ivl_event_name
|
|
|
|
|
* ivl_event_basename
|
|
|
|
|
*
|
|
|
|
|
* ivl_event_edge
|
|
|
|
|
* Return the edge type for the event. If this is a named event
|
|
|
|
|
* that has no network input, then the edge is IVL_EDGE_NONE.
|
|
|
|
|
*/
|
|
|
|
|
extern const char* ivl_event_name(ivl_event_t net);
|
|
|
|
|
extern const char* ivl_event_basename(ivl_event_t net);
|
|
|
|
|
|
2001-04-01 03:48:21 +02:00
|
|
|
extern unsigned ivl_event_nany(ivl_event_t net);
|
|
|
|
|
extern ivl_nexus_t ivl_event_any(ivl_event_t net, unsigned idx);
|
|
|
|
|
|
|
|
|
|
extern unsigned ivl_event_nneg(ivl_event_t net);
|
|
|
|
|
extern ivl_nexus_t ivl_event_neg(ivl_event_t net, unsigned idx);
|
|
|
|
|
|
|
|
|
|
extern unsigned ivl_event_npos(ivl_event_t net);
|
|
|
|
|
extern ivl_nexus_t ivl_event_pos(ivl_event_t net, unsigned idx);
|
2001-03-28 08:07:39 +02:00
|
|
|
|
|
|
|
|
|
2000-10-29 00:32:34 +02:00
|
|
|
/* EXPRESSIONS
|
|
|
|
|
*
|
2000-09-23 07:15:07 +02:00
|
|
|
* These methods operate on expression objects from the
|
|
|
|
|
* design. Expressions mainly exist in behavioral code. The
|
|
|
|
|
* ivl_expr_type() function returns the type of the expression node,
|
|
|
|
|
* and the remaining functions access value bits of the expression.
|
2000-10-29 00:32:34 +02:00
|
|
|
*
|
|
|
|
|
* 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.
|
2000-09-23 07:15:07 +02:00
|
|
|
*/
|
2000-10-29 00:32:34 +02:00
|
|
|
|
2000-09-23 07:15:07 +02:00
|
|
|
extern ivl_expr_type_t ivl_expr_type(ivl_expr_t net);
|
|
|
|
|
|
2000-10-05 07:03:01 +02:00
|
|
|
/* IVL_EX_NUMBER */
|
2000-09-26 02:30:07 +02:00
|
|
|
extern const char* ivl_expr_bits(ivl_expr_t net);
|
2001-04-06 04:28:02 +02:00
|
|
|
/* IVL_EX_UFUNC */
|
|
|
|
|
extern ivl_scope_t ivl_expr_def(ivl_expr_t net);
|
2001-05-06 19:48:20 +02:00
|
|
|
/* IVL_EX_SIGNAL, IVL_EX_SFUNC, IVL_EX_MEMORY */
|
2000-09-24 04:21:53 +02:00
|
|
|
extern const char* ivl_expr_name(ivl_expr_t net);
|
2001-03-29 04:52:39 +02:00
|
|
|
/* IVL_EX_BINARY IVL_EX_UNARY */
|
2000-09-30 04:18:15 +02:00
|
|
|
extern char ivl_expr_opcode(ivl_expr_t net);
|
2001-07-22 02:17:49 +02:00
|
|
|
/* IVL_EX_BINARY IVL_EX_BITSEL IVL_EX_UNARY, IVL_EX_MEMORY IVL_EX_TERNARY */
|
2000-09-30 04:18:15 +02:00
|
|
|
extern ivl_expr_t ivl_expr_oper1(ivl_expr_t net);
|
2001-05-17 06:37:02 +02:00
|
|
|
/* IVL_EX_BINARY IVL_EX_TERNARY */
|
2000-09-30 04:18:15 +02:00
|
|
|
extern ivl_expr_t ivl_expr_oper2(ivl_expr_t net);
|
2001-05-17 06:37:02 +02:00
|
|
|
/* IVL_EX_TERNARY */
|
2000-09-30 04:18:15 +02:00
|
|
|
extern ivl_expr_t ivl_expr_oper3(ivl_expr_t net);
|
2001-04-06 04:28:02 +02:00
|
|
|
/* IVL_EX_CONCAT IVL_EX_UFUNC */
|
2000-10-29 00:32:34 +02:00
|
|
|
extern ivl_expr_t ivl_expr_parm(ivl_expr_t net, unsigned idx);
|
2001-05-20 03:06:16 +02:00
|
|
|
/* IVL_EX_CONCAT IVL_EX_SFUNC IVL_EX_UFUNC */
|
2000-10-29 00:32:34 +02:00
|
|
|
extern unsigned ivl_expr_parms(ivl_expr_t net);
|
|
|
|
|
/* IVL_EX_CONCAT */
|
|
|
|
|
extern unsigned ivl_expr_repeat(ivl_expr_t net);
|
2001-04-02 02:28:35 +02:00
|
|
|
/* IVL_EX_SCOPE */
|
|
|
|
|
extern ivl_scope_t ivl_expr_scope(ivl_expr_t net);
|
2001-07-22 02:17:49 +02:00
|
|
|
/* IVL_EX_BITSEL */
|
|
|
|
|
extern ivl_signal_t ivl_expr_signal(ivl_expr_t net);
|
2000-10-05 07:03:01 +02:00
|
|
|
/* any expression */
|
2000-09-26 02:30:07 +02:00
|
|
|
extern int ivl_expr_signed(ivl_expr_t net);
|
2000-10-07 01:46:50 +02:00
|
|
|
/* IVL_EX_STRING */
|
2000-09-23 07:15:07 +02:00
|
|
|
extern const char* ivl_expr_string(ivl_expr_t net);
|
2001-04-15 04:58:11 +02:00
|
|
|
/* IVL_EX_ULONG */
|
|
|
|
|
extern unsigned long ivl_expr_uvalue(ivl_expr_t net);
|
2000-10-05 07:03:01 +02:00
|
|
|
/* any expression */
|
2000-09-24 04:21:53 +02:00
|
|
|
extern unsigned ivl_expr_width(ivl_expr_t net);
|
2000-09-23 07:15:07 +02:00
|
|
|
|
2001-05-06 19:48:20 +02:00
|
|
|
/*
|
|
|
|
|
* Memory.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
2001-05-09 01:59:33 +02:00
|
|
|
extern const char*ivl_memory_name(ivl_memory_t net);
|
|
|
|
|
extern const char*ivl_memory_basename(ivl_memory_t net);
|
|
|
|
|
extern int ivl_memory_root(ivl_memory_t net);
|
|
|
|
|
extern unsigned ivl_memory_size(ivl_memory_t net);
|
2001-05-06 19:48:20 +02:00
|
|
|
extern unsigned ivl_memory_width(ivl_memory_t net);
|
|
|
|
|
extern ivl_memory_t ivl_expr_memory(ivl_expr_t net);
|
|
|
|
|
|
2000-08-26 02:54:03 +02:00
|
|
|
/* LOGIC
|
|
|
|
|
* These types and functions support manipulation of logic gates. The
|
2000-09-19 06:15:27 +02:00
|
|
|
* ivl_logic_t enumeration identifies the various kinds of gates that
|
2000-08-26 02:54:03 +02:00
|
|
|
* the ivl_net_logic_t can represent. The various functions then
|
2000-09-19 06:15:27 +02:00
|
|
|
* provide access to the bits of information for a given logic device.
|
2000-10-15 06:46:23 +02:00
|
|
|
*
|
|
|
|
|
* ivl_logic_type
|
|
|
|
|
* This method returns the type of logic gate that the cookie
|
|
|
|
|
* represents.
|
|
|
|
|
*
|
|
|
|
|
* ivl_logic_name
|
|
|
|
|
* This method returns the complete name of the logic gate. Every
|
|
|
|
|
* gate has a complete name (that includes the scope) even if the
|
|
|
|
|
* Verilog source doesn't include one. The compiler will choose one
|
|
|
|
|
* if necessary.
|
|
|
|
|
*
|
|
|
|
|
* ivl_logic_basename
|
|
|
|
|
* This is the name of the gate without the scope part.
|
|
|
|
|
*
|
|
|
|
|
* ivl_logic_pins
|
|
|
|
|
* ivl_logic_pin
|
2000-08-26 02:54:03 +02:00
|
|
|
*/
|
2000-08-12 18:34:37 +02:00
|
|
|
|
2000-10-15 06:46:23 +02:00
|
|
|
extern const char* ivl_logic_name(ivl_net_logic_t net);
|
|
|
|
|
extern const char* ivl_logic_basename(ivl_net_logic_t net);
|
2000-10-05 07:03:01 +02:00
|
|
|
extern ivl_logic_t ivl_logic_type(ivl_net_logic_t net);
|
|
|
|
|
extern ivl_nexus_t ivl_logic_pin(ivl_net_logic_t net, unsigned pin);
|
|
|
|
|
extern unsigned ivl_logic_pins(ivl_net_logic_t net);
|
2001-04-23 01:09:45 +02:00
|
|
|
extern ivl_udp_t ivl_logic_udp(ivl_net_logic_t net);
|
|
|
|
|
|
|
|
|
|
/* UDP
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
extern unsigned ivl_udp_sequ(ivl_udp_t net);
|
|
|
|
|
extern unsigned ivl_udp_nin(ivl_udp_t net);
|
|
|
|
|
extern unsigned ivl_udp_init(ivl_udp_t net);
|
|
|
|
|
extern const char* ivl_udp_row(ivl_udp_t net, unsigned idx);
|
|
|
|
|
extern unsigned ivl_udp_rows(ivl_udp_t net);
|
|
|
|
|
extern const char* ivl_udp_name(ivl_udp_t net);
|
|
|
|
|
|
2000-08-26 02:54:03 +02:00
|
|
|
|
2000-11-11 01:03:36 +01:00
|
|
|
/* LPM
|
2001-06-07 04:12:43 +02:00
|
|
|
* These functions support access to the properties of LPM
|
|
|
|
|
* devices. LPM devices are a variety of devices that handle more
|
|
|
|
|
* complex structural semantics.
|
|
|
|
|
*
|
|
|
|
|
* These are the functions that apply to all LPM devices:
|
2000-11-11 01:03:36 +01:00
|
|
|
*
|
|
|
|
|
* ivl_lpm_name
|
|
|
|
|
* Return the name of the device.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lpm_type
|
|
|
|
|
* Return the ivl_lpm_type_t of the secific LPM device.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lpm_width
|
|
|
|
|
* Return the width of the LPM device. What this means depends on
|
|
|
|
|
* the LPM type, but it generally has to do with the width of the
|
|
|
|
|
* output data path.
|
2001-04-26 07:12:02 +02:00
|
|
|
*
|
2001-06-07 04:12:43 +02:00
|
|
|
*
|
|
|
|
|
* These functions apply to a subset of the LPM devices, or may have
|
|
|
|
|
* varying meaning depending on the device:
|
|
|
|
|
*
|
2001-04-26 07:12:02 +02:00
|
|
|
* ivl_lpm_data
|
|
|
|
|
* Return the input data nexus for device types that have a single
|
2001-06-07 04:12:43 +02:00
|
|
|
* input vector. This is also used to the get nexa of the first
|
|
|
|
|
* vector for devices that have more inputs.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lpm_datab
|
|
|
|
|
* Return the input data nexis for device types that have a second
|
|
|
|
|
* input vector. For example, arithmetic devices are like this.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lpm_q
|
|
|
|
|
* Return the output data nexus for device types that have a single
|
|
|
|
|
* output vector. This is most devices, it turns out.
|
2001-04-26 07:12:02 +02:00
|
|
|
*
|
|
|
|
|
* ivl_lpm_selects
|
2001-06-16 04:41:41 +02:00
|
|
|
* This is the size of the select input for a LPM_MUX device, or the
|
|
|
|
|
* address bus width of an LPM_RAM.
|
2001-04-26 07:12:02 +02:00
|
|
|
*
|
|
|
|
|
* ivl_lpm_size
|
|
|
|
|
* In addition to a width, some devices have a size. The size is
|
|
|
|
|
* often the number of inputs per out, i.e. the number of inputs
|
|
|
|
|
* per bit for a MUX.
|
2000-11-11 01:03:36 +01:00
|
|
|
*/
|
|
|
|
|
extern const char* ivl_lpm_name(ivl_lpm_t net);
|
|
|
|
|
extern ivl_lpm_type_t ivl_lpm_type(ivl_lpm_t net);
|
|
|
|
|
extern unsigned ivl_lpm_width(ivl_lpm_t net);
|
|
|
|
|
|
2001-06-16 04:41:41 +02:00
|
|
|
/* IVL_LPM_FF IVL_LPM_RAM */
|
2001-04-26 07:12:02 +02:00
|
|
|
extern ivl_nexus_t ivl_lpm_clk(ivl_lpm_t net);
|
2001-06-16 04:41:41 +02:00
|
|
|
/* IVL_LPM_RAM */
|
|
|
|
|
extern ivl_nexus_t ivl_lpm_enable(ivl_lpm_t net);
|
2001-06-17 01:45:05 +02:00
|
|
|
/* IVL_LPM_ADD IVL_LPM_FF IVL_LPM_MULT IVL_LPM_RAM IVL_LPM_SUB */
|
2001-04-26 07:12:02 +02:00
|
|
|
extern ivl_nexus_t ivl_lpm_data(ivl_lpm_t net, unsigned idx);
|
2001-06-17 01:45:05 +02:00
|
|
|
/* IVL_LPM_ADD IVL_LPM_MULT IVL_LPM_SUB */
|
2001-06-07 04:12:43 +02:00
|
|
|
extern ivl_nexus_t ivl_lpm_datab(ivl_lpm_t net, unsigned idx);
|
2001-04-26 07:12:02 +02:00
|
|
|
/* IVL_LPM_MUX */
|
|
|
|
|
extern ivl_nexus_t ivl_lpm_data2(ivl_lpm_t net, unsigned sdx, unsigned idx);
|
2001-06-17 01:45:05 +02:00
|
|
|
/* IVL_LPM_ADD IVL_LPM_FF IVL_LPM_MULT IVL_LPM_RAM IVL_LPM_SUB */
|
2001-04-26 07:12:02 +02:00
|
|
|
extern ivl_nexus_t ivl_lpm_q(ivl_lpm_t net, unsigned idx);
|
2001-06-16 04:41:41 +02:00
|
|
|
/* IVL_LPM_MUX IVL_LPM_RAM */
|
2001-04-26 07:12:02 +02:00
|
|
|
extern unsigned ivl_lpm_selects(ivl_lpm_t net);
|
2001-06-16 04:41:41 +02:00
|
|
|
/* IVL_LPM_MUX IVL_LPM_RAM */
|
2001-04-26 07:12:02 +02:00
|
|
|
extern ivl_nexus_t ivl_lpm_select(ivl_lpm_t net, unsigned idx);
|
|
|
|
|
/* IVL_LPM_MUX */
|
|
|
|
|
extern unsigned ivl_lpm_size(ivl_lpm_t net);
|
2001-06-16 04:41:41 +02:00
|
|
|
/* IVL_LPM_RAM */
|
|
|
|
|
extern ivl_memory_t ivl_lpm_memory(ivl_lpm_t net);
|
2000-11-11 01:03:36 +01:00
|
|
|
|
2000-10-18 22:04:39 +02:00
|
|
|
|
|
|
|
|
/* LVAL
|
|
|
|
|
* The l-values of assignments are concatenation of ivl_lval_t
|
|
|
|
|
* objects. Each l-value has a bunch of connections (in the form of
|
|
|
|
|
* ivl_nexus_t objects) and possibly a mux expression. The compiler
|
|
|
|
|
* takes care of part selects and nested concatenations. The
|
|
|
|
|
* ivl_stmt_lval function pulls ivl_lval_t objects out of the
|
|
|
|
|
* statement.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lval_mux
|
|
|
|
|
* If the l-value includes a bit select expression, this method
|
|
|
|
|
* returns an ivl_expr_t that represents that
|
2001-05-09 01:59:33 +02:00
|
|
|
* expression. Otherwise, it returns 0.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lval_mem
|
|
|
|
|
* If the l-value is a memory, this method returns an
|
|
|
|
|
* ivl_memory_t that represents that memory. Otherwise, it
|
|
|
|
|
* returns 0.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lval_idx
|
|
|
|
|
* If the l-value is a memory, this method returns an
|
|
|
|
|
* ivl_expr_t that represents the index expression. Otherwise, it
|
|
|
|
|
* returns 0.
|
2000-10-18 22:04:39 +02:00
|
|
|
*
|
|
|
|
|
* ivl_lval_pin
|
|
|
|
|
* Return an ivl_nexus_t for the connection of the ivl_lval_t.
|
|
|
|
|
*
|
|
|
|
|
* ivl_lval_pins
|
2001-05-09 01:59:33 +02:00
|
|
|
* Return the number of pins for this object. */
|
2000-10-18 22:04:39 +02:00
|
|
|
|
|
|
|
|
extern ivl_expr_t ivl_lval_mux(ivl_lval_t net);
|
2001-05-09 01:59:33 +02:00
|
|
|
extern ivl_expr_t ivl_lval_idx(ivl_lval_t net);
|
|
|
|
|
extern ivl_memory_t ivl_lval_mem(ivl_lval_t net);
|
2000-10-18 22:04:39 +02:00
|
|
|
extern unsigned ivl_lval_pins(ivl_lval_t net);
|
|
|
|
|
extern ivl_nexus_t ivl_lval_pin(ivl_lval_t net, unsigned idx);
|
|
|
|
|
|
|
|
|
|
|
2000-08-26 02:54:03 +02:00
|
|
|
/* NEXUS
|
|
|
|
|
* connections of signals and nodes is handled by single-bit
|
2000-10-15 06:46:23 +02:00
|
|
|
* nexus. These functions manage the ivl_nexus_t object. They also
|
|
|
|
|
* manage the ivl_nexus_ptr_t objects that are closely related to the
|
|
|
|
|
* nexus.
|
|
|
|
|
*
|
|
|
|
|
* ivl_nexus_name
|
|
|
|
|
* Each nexus is given a name, typically derived from the signals
|
|
|
|
|
* connected to it, but completely made up if need be. The name of
|
|
|
|
|
* every nexus is unique.
|
|
|
|
|
*
|
|
|
|
|
* ivl_nexus_ptrs
|
|
|
|
|
* This function returns the number of pointers that are held by
|
|
|
|
|
* the nexus. It should always return at least 1. The pointer
|
|
|
|
|
* proper is accessed by index.
|
|
|
|
|
*
|
|
|
|
|
* ivl_nexus_ptr
|
|
|
|
|
* Return a nexus pointer given the nexus and an index.
|
2000-10-25 07:41:24 +02:00
|
|
|
*
|
|
|
|
|
* Once an ivl_nexus_ptr_t is selected by the ivl_nexus_ptr method,
|
|
|
|
|
* the properties of the pointer can be accessed by the following
|
|
|
|
|
* methods:
|
|
|
|
|
*
|
|
|
|
|
* ivl_nexus_ptr_pin
|
|
|
|
|
* This returns the pin number of the device where this nexus
|
|
|
|
|
* points. It is the bit within the signal or logic device that is
|
|
|
|
|
* connected to the nexus.
|
|
|
|
|
*
|
2000-12-05 07:29:33 +01:00
|
|
|
* If the target is an LPM device, then this value is zero, and it
|
|
|
|
|
* is up to the application to find the pin that referse to this
|
|
|
|
|
* nexus. The problem is that LPM devices do not have a pinout per
|
|
|
|
|
* se, the pins all have specific names.
|
|
|
|
|
*
|
2001-04-30 01:17:38 +02:00
|
|
|
* ivl_nexus_ptr_con
|
|
|
|
|
* If this is a pointer to a magic constant device, then this
|
|
|
|
|
* returns the net_const object.
|
|
|
|
|
*
|
2001-05-12 05:18:44 +02:00
|
|
|
* ivl_nexus_ptr_drive0
|
|
|
|
|
* ivl_nexus_ptr_drive1
|
|
|
|
|
* These are the 0 and 1 strength values for the devices. For most
|
|
|
|
|
* devices, these values are fixed by the description in the
|
|
|
|
|
* original source, with the default as IVL_DR_STRONG. For pins
|
|
|
|
|
* that are input only, drive0 and drive1 are both IVL_DR_HiZ.
|
|
|
|
|
*
|
|
|
|
|
* The strength of strength-aware devices (such as nmos devices)
|
|
|
|
|
* does not really matter, as long at the output is not
|
|
|
|
|
* IVL_DR_HiZ. Testing for HiZ drivers is how code generators
|
|
|
|
|
* detect inputs.
|
|
|
|
|
*
|
2000-12-05 07:29:33 +01:00
|
|
|
* ivl_nexus_ptr_log
|
|
|
|
|
* If the target object is an ivl_net_logic_t, this method returns
|
|
|
|
|
* the object. Otherwise, this method returns 0.
|
|
|
|
|
*
|
|
|
|
|
* ivl_nexus_ptr_lpm
|
|
|
|
|
* If the target object is an ivl_lpm_t, this method returns the
|
|
|
|
|
* object. Otherwise, this method returns 0.
|
|
|
|
|
*
|
2000-10-25 07:41:24 +02:00
|
|
|
* ivl_nexus_ptr_sig
|
|
|
|
|
* If the target object is an ivl_signal_t, this method returns the
|
|
|
|
|
* object. If the target is not a signal, this method returns 0.
|
2000-08-26 02:54:03 +02:00
|
|
|
*/
|
|
|
|
|
|
2000-10-15 06:46:23 +02:00
|
|
|
extern const char* ivl_nexus_name(ivl_nexus_t net);
|
|
|
|
|
extern unsigned ivl_nexus_ptrs(ivl_nexus_t net);
|
|
|
|
|
extern ivl_nexus_ptr_t ivl_nexus_ptr(ivl_nexus_t net, unsigned idx);
|
2000-08-27 17:51:50 +02:00
|
|
|
|
2001-04-30 01:17:38 +02:00
|
|
|
extern ivl_drive_t ivl_nexus_ptr_drive0(ivl_nexus_ptr_t net);
|
|
|
|
|
extern ivl_drive_t ivl_nexus_ptr_drive1(ivl_nexus_ptr_t net);
|
2000-10-25 07:41:24 +02:00
|
|
|
extern unsigned ivl_nexus_ptr_pin(ivl_nexus_ptr_t net);
|
2001-04-30 01:17:38 +02:00
|
|
|
extern ivl_net_const_t ivl_nexus_ptr_con(ivl_nexus_ptr_t net);
|
2000-12-05 07:29:33 +01:00
|
|
|
extern ivl_net_logic_t ivl_nexus_ptr_log(ivl_nexus_ptr_t net);
|
|
|
|
|
extern ivl_lpm_t ivl_nexus_ptr_lpm(ivl_nexus_ptr_t net);
|
2000-10-25 07:41:24 +02:00
|
|
|
extern ivl_signal_t ivl_nexus_ptr_sig(ivl_nexus_ptr_t net);
|
|
|
|
|
|
2000-10-08 06:01:54 +02:00
|
|
|
|
|
|
|
|
/* SCOPE
|
|
|
|
|
* Scopes of various sort have these properties. Use these methods to
|
2000-10-15 06:46:23 +02:00
|
|
|
* access them. Scopes come to exist in the elaborated design
|
|
|
|
|
* generally when a module is instantiated, though they also come from
|
|
|
|
|
* named blocks, tasks and functions.
|
|
|
|
|
*
|
|
|
|
|
* (NOTE: Module scopes are *instances* of modules, and not the module
|
|
|
|
|
* definition. A definition may apply to many instances.)
|
|
|
|
|
*
|
|
|
|
|
* ivl_scope_children
|
|
|
|
|
* A scope may in turn contain other scopes. This method iterates
|
|
|
|
|
* through all the child scopes of a given scope. If the function
|
|
|
|
|
* returns any value other then 0, the iteration stops and the
|
|
|
|
|
* method returns that value. Otherwise, iteration continues until
|
|
|
|
|
* the children run out.
|
|
|
|
|
*
|
|
|
|
|
* If the scope has no children, this method will return 0 and
|
|
|
|
|
* otherwise do nothing.
|
|
|
|
|
*
|
2001-04-02 04:28:12 +02:00
|
|
|
* ivl_scope_def
|
|
|
|
|
* Task definition scopes carry a task definition, in the form of
|
|
|
|
|
* a statement. This method accesses that definition.
|
|
|
|
|
*
|
2001-03-28 08:07:39 +02:00
|
|
|
* ivl_scope_event
|
|
|
|
|
* ivl_scope_events
|
|
|
|
|
* Scopes have 0 or more event objects in them.
|
|
|
|
|
*
|
2000-10-15 06:46:23 +02:00
|
|
|
* ivl_scope_log
|
|
|
|
|
* ivl_scope_logs
|
|
|
|
|
* Scopes have 0 or more logic devices in them. A logic device is
|
|
|
|
|
* represented by ivl_logic_t.
|
|
|
|
|
*
|
|
|
|
|
* ivl_scope_name
|
|
|
|
|
* Every scope has a hierarchical name. This name is also a prefix
|
|
|
|
|
* of all the names of objects contained within the scope.
|
|
|
|
|
*
|
2001-04-06 04:28:02 +02:00
|
|
|
* ivl_scope_port
|
|
|
|
|
* ivl_scope_ports
|
|
|
|
|
* Scopes that are functions or tasks have ports defined by
|
|
|
|
|
* signals. These methods access the ports by name.
|
|
|
|
|
*
|
|
|
|
|
* If this scope represents a function, then the ports list
|
|
|
|
|
* includes the return value, as port 0. The remaining ports are
|
|
|
|
|
* the input ports in order.
|
|
|
|
|
*
|
2000-10-15 06:46:23 +02:00
|
|
|
* ivl_scope_sig
|
|
|
|
|
* ivl_scope_sigs
|
|
|
|
|
* Scopes have 0 or more signals in them. These signals are
|
|
|
|
|
* anything that can become and ivl_signal_t, include synthetic
|
|
|
|
|
* signals generated by the compiler.
|
2001-01-15 01:47:01 +01:00
|
|
|
*
|
|
|
|
|
* ivl_scope_type
|
|
|
|
|
* ivl_scope_tname
|
|
|
|
|
* Scopes have a type and a type name. For example, if a scope is
|
|
|
|
|
* an instance of module foo, its type is IVL_SCT_MODULE and its
|
|
|
|
|
* type name is "foo". This is different from the instance name
|
|
|
|
|
* returned by ivl_scope_name above.
|
2000-10-08 06:01:54 +02:00
|
|
|
*/
|
2000-10-15 06:46:23 +02:00
|
|
|
|
2001-01-15 01:05:39 +01:00
|
|
|
extern int ivl_scope_children(ivl_scope_t net,
|
|
|
|
|
ivl_scope_f func, void*cd);
|
2001-04-02 04:28:12 +02:00
|
|
|
|
|
|
|
|
extern ivl_statement_t ivl_scope_def(ivl_scope_t net);
|
|
|
|
|
|
2001-03-28 08:07:39 +02:00
|
|
|
extern unsigned ivl_scope_events(ivl_scope_t net);
|
|
|
|
|
extern ivl_event_t ivl_scope_event(ivl_scope_t net, unsigned idx);
|
2000-10-15 06:46:23 +02:00
|
|
|
extern unsigned ivl_scope_logs(ivl_scope_t net);
|
|
|
|
|
extern ivl_net_logic_t ivl_scope_log(ivl_scope_t net, unsigned idx);
|
2000-11-11 01:03:36 +01:00
|
|
|
extern unsigned ivl_scope_lpms(ivl_scope_t net);
|
|
|
|
|
extern ivl_lpm_t ivl_scope_lpm(ivl_scope_t, unsigned idx);
|
2001-05-09 01:59:33 +02:00
|
|
|
extern unsigned ivl_scope_mems(ivl_scope_t net);
|
|
|
|
|
extern ivl_memory_t ivl_scope_mem(ivl_scope_t net, unsigned idx);
|
2000-10-15 06:46:23 +02:00
|
|
|
extern const char* ivl_scope_name(ivl_scope_t net);
|
2001-04-06 04:28:02 +02:00
|
|
|
extern unsigned ivl_scope_ports(ivl_scope_t net);
|
|
|
|
|
extern const char* ivl_scope_port(ivl_scope_t net, unsigned idx);
|
2000-10-15 06:46:23 +02:00
|
|
|
extern unsigned ivl_scope_sigs(ivl_scope_t net);
|
|
|
|
|
extern ivl_signal_t ivl_scope_sig(ivl_scope_t net, unsigned idx);
|
2001-01-15 23:05:14 +01:00
|
|
|
extern ivl_scope_type_t ivl_scope_type(ivl_scope_t net);
|
|
|
|
|
extern const char* ivl_scope_tname(ivl_scope_t net);
|
2000-10-08 06:01:54 +02:00
|
|
|
|
|
|
|
|
|
2000-09-24 17:46:00 +02:00
|
|
|
/* SIGNALS
|
|
|
|
|
* Signals are named things in the Verilog source, like wires and
|
|
|
|
|
* regs, and also named things that are preated as temporaries during
|
|
|
|
|
* certain elaboration or optimization steps. A signal may also be a
|
|
|
|
|
* port of a module or task.
|
|
|
|
|
*
|
|
|
|
|
* Signals have a name (obviously) and types. A signal may also be
|
|
|
|
|
* signed or unsigned.
|
2000-12-05 07:29:33 +01:00
|
|
|
*
|
|
|
|
|
* ivl_signal_pins
|
|
|
|
|
* ivl_signal_pin
|
|
|
|
|
* The ivl_signal_pin function returns the nexus connected to the
|
|
|
|
|
* signal. If the signal is a vectory, the idx can be a non-zero
|
|
|
|
|
* value, and the result is the nexus for the specified bit.
|
|
|
|
|
*
|
|
|
|
|
* ivl_signal_port
|
|
|
|
|
* If the signal is a port to a module, this function returns the
|
|
|
|
|
* port direction. If the signal is not a port, it returns
|
|
|
|
|
* IVL_SIP_NONE.
|
|
|
|
|
*
|
2001-04-05 03:12:27 +02:00
|
|
|
* ivl_signal_signed
|
|
|
|
|
* A signal, which is a vector, may be signed. In Verilog 2000, any
|
|
|
|
|
* net or variable may be signed. This function returns true if the
|
|
|
|
|
* signal is signed.
|
|
|
|
|
*
|
2000-12-05 07:29:33 +01:00
|
|
|
* ivl_signal_type
|
2001-04-05 03:12:27 +02:00
|
|
|
* Return the type of the signal, i.e. reg, wire, tri0, et al.
|
2000-12-05 07:29:33 +01:00
|
|
|
*
|
|
|
|
|
* ivl_signal_name
|
|
|
|
|
* This function returns the fully scoped hierarchical name for the
|
|
|
|
|
* signal. The name refers to the entire vector that is the signal.
|
|
|
|
|
*
|
|
|
|
|
* ivl_signal_basename
|
|
|
|
|
* This function returns the name of the signal, without the scope
|
|
|
|
|
* information. This is the tail of the signal name.
|
|
|
|
|
*
|
|
|
|
|
* ivl_signal_attr
|
|
|
|
|
* Icarus Verilog supports attaching attributes to signals, with
|
|
|
|
|
* the attribute value (a string) associated with a key. This
|
|
|
|
|
* function returns the attribute value for the given key. If the
|
|
|
|
|
* key does not exist, the function returns 0.
|
2000-09-24 17:46:00 +02:00
|
|
|
*/
|
2000-12-05 07:29:33 +01:00
|
|
|
|
2000-10-25 07:41:24 +02:00
|
|
|
extern ivl_nexus_t ivl_signal_pin(ivl_signal_t net, unsigned idx);
|
|
|
|
|
extern unsigned ivl_signal_pins(ivl_signal_t net);
|
2000-09-24 17:46:00 +02:00
|
|
|
extern ivl_signal_port_t ivl_signal_port(ivl_signal_t net);
|
2001-04-05 03:12:27 +02:00
|
|
|
extern int ivl_signal_signed(ivl_signal_t net);
|
2000-09-24 17:46:00 +02:00
|
|
|
extern ivl_signal_type_t ivl_signal_type(ivl_signal_t net);
|
2000-10-08 06:01:54 +02:00
|
|
|
extern const char* ivl_signal_name(ivl_signal_t net);
|
|
|
|
|
extern const char* ivl_signal_basename(ivl_signal_t net);
|
2000-12-05 07:29:33 +01:00
|
|
|
extern const char* ivl_signal_attr(ivl_signal_t net, const char*key);
|
2000-10-08 06:01:54 +02:00
|
|
|
|
2000-08-20 06:13:56 +02:00
|
|
|
|
2000-09-18 03:24:32 +02:00
|
|
|
/*
|
|
|
|
|
* These functions get information about a process. A process is
|
|
|
|
|
* an initial or always block within the original Verilog source, that
|
|
|
|
|
* is translated into a type and a single statement. (The statement
|
|
|
|
|
* may be a compound statement.)
|
|
|
|
|
*
|
2000-10-05 07:03:01 +02:00
|
|
|
* The ivl_process_type function gets the type of the process,
|
2000-09-18 03:24:32 +02:00
|
|
|
* an "inital" or "always" statement.
|
|
|
|
|
*
|
2001-03-20 02:44:13 +01:00
|
|
|
* A process is placed in a scope. The statement within the process
|
|
|
|
|
* operates within the scope of the process unless there are calls
|
|
|
|
|
* outside the scope.
|
|
|
|
|
*
|
2000-10-05 07:03:01 +02:00
|
|
|
* The ivl_process_stmt function gets the statement that forms the
|
2000-09-18 03:24:32 +02:00
|
|
|
* process. See the statement related functions for how to manipulate
|
|
|
|
|
* statements.
|
|
|
|
|
*/
|
2000-10-05 07:03:01 +02:00
|
|
|
extern ivl_process_type_t ivl_process_type(ivl_process_t net);
|
2000-09-18 03:24:32 +02:00
|
|
|
|
2001-03-20 02:44:13 +01:00
|
|
|
extern ivl_scope_t ivl_process_scope(ivl_process_t net);
|
|
|
|
|
|
2000-10-05 07:03:01 +02:00
|
|
|
extern ivl_statement_t ivl_process_stmt(ivl_process_t net);
|
2000-09-18 03:24:32 +02:00
|
|
|
|
2000-09-19 06:15:27 +02:00
|
|
|
/*
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
|
|
|
|
|
2001-03-30 07:49:52 +02:00
|
|
|
/* IVL_ST_BLOCK, IVL_ST_FORK */
|
2000-09-19 06:15:27 +02:00
|
|
|
extern unsigned ivl_stmt_block_count(ivl_statement_t net);
|
2001-03-30 07:49:52 +02:00
|
|
|
/* IVL_ST_BLOCK, IVL_ST_FORK */
|
2000-09-19 06:15:27 +02:00
|
|
|
extern ivl_statement_t ivl_stmt_block_stmt(ivl_statement_t net, unsigned i);
|
2001-04-21 02:55:46 +02:00
|
|
|
/* IVL_ST_UTASK IVL_ST_DISABLE */
|
2001-04-02 04:28:12 +02:00
|
|
|
extern ivl_scope_t ivl_stmt_call(ivl_statement_t net);
|
2001-03-31 19:36:38 +02:00
|
|
|
/* IVL_ST_CASE */
|
|
|
|
|
extern unsigned ivl_stmt_case_count(ivl_statement_t net);
|
|
|
|
|
/* IVL_ST_CASE */
|
|
|
|
|
extern ivl_expr_t ivl_stmt_case_expr(ivl_statement_t net, unsigned i);
|
|
|
|
|
/* IVL_ST_CASE */
|
|
|
|
|
extern ivl_statement_t ivl_stmt_case_stmt(ivl_statement_t net, unsigned i);
|
2001-04-05 05:20:57 +02:00
|
|
|
/* IVL_ST_CONDIT IVL_ST_CASE IVL_ST_REPEAT IVL_ST_WHILE */
|
2000-09-30 04:18:15 +02:00
|
|
|
extern ivl_expr_t ivl_stmt_cond_expr(ivl_statement_t net);
|
2000-10-05 07:03:01 +02:00
|
|
|
/* IVL_ST_CONDIT */
|
2000-09-19 06:15:27 +02:00
|
|
|
extern ivl_statement_t ivl_stmt_cond_false(ivl_statement_t net);
|
2000-10-05 07:03:01 +02:00
|
|
|
/* IVL_ST_CONDIT */
|
2000-09-19 06:15:27 +02:00
|
|
|
extern ivl_statement_t ivl_stmt_cond_true(ivl_statement_t net);
|
2001-07-19 06:55:06 +02:00
|
|
|
/* IVL_ST_ASSIGN IVL_ST_ASSIGN_NB IVL_ST_DELAYX */
|
2001-04-15 04:58:11 +02:00
|
|
|
extern ivl_expr_t ivl_stmt_delay_expr(ivl_statement_t net);
|
2000-09-19 06:15:27 +02:00
|
|
|
/* IVL_ST_DELAY */
|
|
|
|
|
extern unsigned long ivl_stmt_delay_val(ivl_statement_t net);
|
2001-03-28 08:07:39 +02:00
|
|
|
/* IVL_ST_WAIT */
|
|
|
|
|
extern ivl_event_t ivl_stmt_event(ivl_statement_t net);
|
2001-04-03 06:50:37 +02:00
|
|
|
/* IVL_ST_ASSIGN IVL_ST_ASSIGN_NB */
|
2000-10-18 22:04:39 +02:00
|
|
|
extern ivl_lval_t ivl_stmt_lval(ivl_statement_t net, unsigned idx);
|
2001-04-03 06:50:37 +02:00
|
|
|
/* IVL_ST_ASSIGN IVL_ST_ASSIGN_NB */
|
2000-10-18 22:04:39 +02:00
|
|
|
extern unsigned ivl_stmt_lvals(ivl_statement_t net);
|
2001-04-03 06:50:37 +02:00
|
|
|
/* IVL_ST_ASSIGN IVL_ST_ASSIGN_NB */
|
2000-10-07 01:46:50 +02:00
|
|
|
extern unsigned ivl_stmt_lwidth(ivl_statement_t net);
|
2000-09-22 05:58:30 +02:00
|
|
|
/* IVL_ST_STASK */
|
|
|
|
|
extern const char* ivl_stmt_name(ivl_statement_t net);
|
2000-09-23 07:15:07 +02:00
|
|
|
/* IVL_ST_STASK */
|
|
|
|
|
extern ivl_expr_t ivl_stmt_parm(ivl_statement_t net, unsigned idx);
|
|
|
|
|
/* IVL_ST_STASK */
|
|
|
|
|
extern unsigned ivl_stmt_parm_count(ivl_statement_t net);
|
2001-04-03 06:50:37 +02:00
|
|
|
/* IVL_ST_ASSIGN IVL_ST_ASSIGN_NB */
|
2000-10-07 01:46:50 +02:00
|
|
|
extern ivl_expr_t ivl_stmt_rval(ivl_statement_t net);
|
2001-07-19 06:55:06 +02:00
|
|
|
/* IVL_ST_DELAY, IVL_ST_DELAYX, IVL_ST_FOREVER, IVL_ST_REPEAT
|
|
|
|
|
IVL_ST_WAIT, IVL_ST_WHILE */
|
2000-09-19 06:15:27 +02:00
|
|
|
extern ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net);
|
|
|
|
|
|
2000-09-18 03:24:32 +02:00
|
|
|
|
2000-08-12 18:34:37 +02:00
|
|
|
|
2000-10-21 18:49:45 +02:00
|
|
|
/* target_design
|
2000-08-12 18:34:37 +02:00
|
|
|
|
2000-10-21 18:49:45 +02:00
|
|
|
The "target_design" function is called once after the whole design
|
|
|
|
|
is processed and available to the target. The target doesn't return
|
|
|
|
|
from this function until it is finished with the design.
|
2000-08-12 18:34:37 +02:00
|
|
|
|
2000-10-21 18:49:45 +02:00
|
|
|
This function is implemented in the loaded target, and not in the
|
|
|
|
|
ivl core. This function is how the target module is invoked. */
|
2000-08-14 06:39:56 +02:00
|
|
|
|
2000-10-21 18:49:45 +02:00
|
|
|
typedef int (*target_design_f)(ivl_design_t des);
|
2000-08-19 20:12:42 +02:00
|
|
|
|
|
|
|
|
|
2000-08-12 18:34:37 +02:00
|
|
|
_END_DECL
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* $Log: ivl_target.h,v $
|
2001-07-22 02:17:49 +02:00
|
|
|
* Revision 1.73 2001/07/22 00:17:49 steve
|
|
|
|
|
* Support the NetESubSignal expressions in vvp.tgt.
|
|
|
|
|
*
|
2001-07-19 06:55:06 +02:00
|
|
|
* Revision 1.72 2001/07/19 04:55:06 steve
|
|
|
|
|
* Support calculated delays in vvp.tgt.
|
|
|
|
|
*
|
2001-07-05 00:59:25 +02:00
|
|
|
* Revision 1.71 2001/07/04 22:59:25 steve
|
|
|
|
|
* handle left shifter in dll output.
|
|
|
|
|
*
|
2001-07-01 01:03:16 +02:00
|
|
|
* Revision 1.70 2001/06/30 23:03:16 steve
|
|
|
|
|
* support fast programming by only writing the bits
|
|
|
|
|
* that are listed in the input file.
|
|
|
|
|
*
|
2001-06-19 05:01:10 +02:00
|
|
|
* Revision 1.69 2001/06/19 03:01:10 steve
|
|
|
|
|
* Add structural EEQ gates (Stephan Boettcher)
|
|
|
|
|
*
|
2001-06-17 01:45:05 +02:00
|
|
|
* Revision 1.68 2001/06/16 23:45:05 steve
|
|
|
|
|
* Add support for structural multiply in t-dll.
|
|
|
|
|
* Add code generators and vvp support for both
|
|
|
|
|
* structural and behavioral multiply.
|
|
|
|
|
*
|
2001-06-16 04:41:41 +02:00
|
|
|
* Revision 1.67 2001/06/16 02:41:41 steve
|
|
|
|
|
* Generate code to support memory access in continuous
|
|
|
|
|
* assignment statements. (Stephan Boettcher)
|
|
|
|
|
*
|
2001-06-15 06:14:18 +02:00
|
|
|
* Revision 1.66 2001/06/15 04:14:18 steve
|
|
|
|
|
* Generate vvp code for GT and GE comparisons.
|
|
|
|
|
*
|
2001-06-07 05:09:37 +02:00
|
|
|
* Revision 1.65 2001/06/07 03:09:37 steve
|
|
|
|
|
* support subtraction in tgt-vvp.
|
|
|
|
|
*
|
2001-06-07 04:12:43 +02:00
|
|
|
* Revision 1.64 2001/06/07 02:12:43 steve
|
|
|
|
|
* Support structural addition.
|
|
|
|
|
*
|
2001-05-20 03:06:16 +02:00
|
|
|
* Revision 1.63 2001/05/20 01:06:16 steve
|
|
|
|
|
* stub ivl_expr_parms for sfunctions.
|
|
|
|
|
*
|
2001-05-17 06:37:02 +02:00
|
|
|
* Revision 1.62 2001/05/17 04:37:02 steve
|
|
|
|
|
* Behavioral ternary operators for vvp.
|
|
|
|
|
*
|
2001-05-12 05:18:44 +02:00
|
|
|
* Revision 1.61 2001/05/12 03:18:44 steve
|
|
|
|
|
* Make sure LPM devices have drives on outputs.
|
|
|
|
|
*
|
2001-05-09 01:59:33 +02:00
|
|
|
* Revision 1.60 2001/05/08 23:59:33 steve
|
|
|
|
|
* Add ivl and vvp.tgt support for memories in
|
|
|
|
|
* expressions and l-values. (Stephan Boettcher)
|
|
|
|
|
*
|
2001-05-08 06:13:12 +02:00
|
|
|
* Revision 1.59 2001/05/08 04:13:12 steve
|
|
|
|
|
* sort enumeration values.
|
|
|
|
|
*
|
2001-05-06 19:48:20 +02:00
|
|
|
* Revision 1.58 2001/05/06 17:48:20 steve
|
|
|
|
|
* Support memory objects. (Stephan Boettcher)
|
|
|
|
|
*
|
2001-04-30 01:17:38 +02:00
|
|
|
* Revision 1.57 2001/04/29 23:17:38 steve
|
|
|
|
|
* Carry drive strengths in the ivl_nexus_ptr_t, and
|
|
|
|
|
* handle constant devices in targets.'
|
|
|
|
|
*
|
2001-04-29 22:19:10 +02:00
|
|
|
* Revision 1.56 2001/04/29 20:19:10 steve
|
|
|
|
|
* Add pullup and pulldown devices.
|
|
|
|
|
*
|
2001-04-26 07:12:02 +02:00
|
|
|
* Revision 1.55 2001/04/26 05:12:02 steve
|
|
|
|
|
* Implement simple MUXZ for ?: operators.
|
|
|
|
|
*
|
2001-04-23 01:09:45 +02:00
|
|
|
* Revision 1.54 2001/04/22 23:09:46 steve
|
|
|
|
|
* More UDP consolidation from Stephan Boettcher.
|
|
|
|
|
*
|
2001-04-21 02:55:46 +02:00
|
|
|
* Revision 1.53 2001/04/21 00:55:46 steve
|
|
|
|
|
* Generate code for disable.
|
|
|
|
|
*
|
2001-04-15 04:58:11 +02:00
|
|
|
* Revision 1.52 2001/04/15 02:58:11 steve
|
|
|
|
|
* vvp support for <= with internal delay.
|
|
|
|
|
*
|
2001-04-07 21:24:36 +02:00
|
|
|
* Revision 1.51 2001/04/07 19:24:36 steve
|
|
|
|
|
* Add the disable statemnent.
|
|
|
|
|
*
|
2001-04-06 04:28:02 +02:00
|
|
|
* Revision 1.50 2001/04/06 02:28:02 steve
|
|
|
|
|
* Generate vvp code for functions with ports.
|
|
|
|
|
*
|
2001-04-05 05:20:57 +02:00
|
|
|
* Revision 1.49 2001/04/05 03:20:57 steve
|
|
|
|
|
* Generate vvp code for the repeat statement.
|
|
|
|
|
*
|
2001-04-05 03:12:27 +02:00
|
|
|
* Revision 1.48 2001/04/05 01:12:27 steve
|
|
|
|
|
* Get signed compares working correctly in vvp.
|
|
|
|
|
*
|
2001-04-04 06:50:35 +02:00
|
|
|
* Revision 1.47 2001/04/04 04:50:35 steve
|
|
|
|
|
* Support forever loops in the tgt-vvp target.
|
|
|
|
|
*
|
2001-04-03 06:50:37 +02:00
|
|
|
* Revision 1.46 2001/04/03 04:50:37 steve
|
|
|
|
|
* Support non-blocking assignments.
|
|
|
|
|
*
|
2001-04-02 04:28:12 +02:00
|
|
|
* Revision 1.45 2001/04/02 02:28:12 steve
|
|
|
|
|
* Generate code for task calls.
|
|
|
|
|
*
|
2001-04-02 02:28:35 +02:00
|
|
|
* Revision 1.44 2001/04/02 00:28:35 steve
|
|
|
|
|
* Support the scope expression node.
|
|
|
|
|
*
|
2001-04-01 08:52:27 +02:00
|
|
|
* Revision 1.43 2001/04/01 06:52:27 steve
|
|
|
|
|
* support the NetWhile statement.
|
|
|
|
|
*
|
2001-04-01 06:38:17 +02:00
|
|
|
* Revision 1.42 2001/04/01 04:38:17 steve
|
|
|
|
|
* dead cruft.
|
|
|
|
|
*
|
2001-04-01 03:48:21 +02:00
|
|
|
* Revision 1.41 2001/04/01 01:48:21 steve
|
|
|
|
|
* Redesign event information to support arbitrary edge combining.
|
|
|
|
|
*
|
2001-03-31 19:36:38 +02:00
|
|
|
* Revision 1.40 2001/03/31 17:36:38 steve
|
|
|
|
|
* Generate vvp code for case statements.
|
|
|
|
|
*
|
2001-03-30 07:49:52 +02:00
|
|
|
* Revision 1.39 2001/03/30 05:49:52 steve
|
|
|
|
|
* Generate code for fork/join statements.
|
|
|
|
|
*
|
2001-03-29 04:52:39 +02:00
|
|
|
* Revision 1.38 2001/03/29 02:52:39 steve
|
|
|
|
|
* Add unary ~ operator to tgt-vvp.
|
|
|
|
|
*
|
2001-03-28 08:07:39 +02:00
|
|
|
* Revision 1.37 2001/03/28 06:07:39 steve
|
|
|
|
|
* Add the ivl_event_t to ivl_target, and use that to generate
|
|
|
|
|
* .event statements in vvp way ahead of the thread that uses it.
|
|
|
|
|
*
|
2001-03-27 08:27:40 +02:00
|
|
|
* Revision 1.36 2001/03/27 06:27:40 steve
|
|
|
|
|
* Generate code for simple @ statements.
|
|
|
|
|
*
|
2001-03-20 02:44:13 +01:00
|
|
|
* Revision 1.35 2001/03/20 01:44:13 steve
|
|
|
|
|
* Put processes in the proper scope.
|
|
|
|
|
*
|
2001-01-15 23:05:14 +01:00
|
|
|
* Revision 1.34 2001/01/15 22:05:14 steve
|
|
|
|
|
* Declare ivl_scope_type functions.
|
|
|
|
|
*
|
2001-01-15 01:47:01 +01:00
|
|
|
* Revision 1.33 2001/01/15 00:47:01 steve
|
|
|
|
|
* Pass scope type information to the target module.
|
|
|
|
|
*
|
2001-01-15 01:05:39 +01:00
|
|
|
* Revision 1.32 2001/01/15 00:05:39 steve
|
|
|
|
|
* Add client data pointer for scope and process scanners.
|
|
|
|
|
*
|
2001-01-06 07:31:58 +01:00
|
|
|
* Revision 1.31 2001/01/06 06:31:58 steve
|
|
|
|
|
* declaration initialization for time variables.
|
|
|
|
|
*
|
2000-12-05 07:29:33 +01:00
|
|
|
* Revision 1.30 2000/12/05 06:29:33 steve
|
|
|
|
|
* Make signal attributes available to ivl_target API.
|
|
|
|
|
*
|
2000-11-12 18:47:29 +01:00
|
|
|
* Revision 1.29 2000/11/12 17:47:29 steve
|
|
|
|
|
* flip-flop pins for ivl_target API.
|
|
|
|
|
*
|
2000-11-11 02:52:09 +01:00
|
|
|
* Revision 1.28 2000/11/11 01:52:09 steve
|
|
|
|
|
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
|
|
|
|
* change set to correct behavior of bufif0 and bufif1
|
|
|
|
|
* (Tim Leight)
|
|
|
|
|
*
|
|
|
|
|
* Also includes fix for PR#27
|
|
|
|
|
*
|
2000-11-11 01:03:36 +01:00
|
|
|
* Revision 1.27 2000/11/11 00:03:36 steve
|
|
|
|
|
* Add support for the t-dll backend grabing flip-flops.
|
|
|
|
|
*
|
2000-10-31 18:49:02 +01:00
|
|
|
* Revision 1.26 2000/10/31 17:49:02 steve
|
|
|
|
|
* Support time variables.
|
|
|
|
|
*
|
2000-10-29 00:32:34 +02:00
|
|
|
* Revision 1.25 2000/10/28 22:32:34 steve
|
|
|
|
|
* API for concatenation expressions.
|
|
|
|
|
*
|
2000-10-28 19:55:03 +02:00
|
|
|
* Revision 1.24 2000/10/28 17:55:03 steve
|
|
|
|
|
* stub for the concat operator.
|
|
|
|
|
*
|
2000-10-25 07:41:24 +02:00
|
|
|
* Revision 1.23 2000/10/25 05:41:24 steve
|
|
|
|
|
* Get target signal from nexus_ptr.
|
|
|
|
|
*
|
2000-10-21 18:49:45 +02:00
|
|
|
* Revision 1.22 2000/10/21 16:49:45 steve
|
|
|
|
|
* Reduce the target entry points to the target_design.
|
|
|
|
|
*
|
2000-10-18 22:04:39 +02:00
|
|
|
* Revision 1.21 2000/10/18 20:04:39 steve
|
|
|
|
|
* Add ivl_lval_t and support for assignment l-values.
|
|
|
|
|
*
|
2000-10-15 06:46:23 +02:00
|
|
|
* Revision 1.20 2000/10/15 04:46:23 steve
|
|
|
|
|
* Scopes and processes are accessible randomly from
|
|
|
|
|
* the design, and signals and logic are accessible
|
|
|
|
|
* from scopes. Remove the target calls that are no
|
|
|
|
|
* longer needed.
|
|
|
|
|
*
|
|
|
|
|
* Add the ivl_nexus_ptr_t and the means to get at
|
|
|
|
|
* them from nexus objects.
|
|
|
|
|
*
|
|
|
|
|
* Give names to methods that manipulate the ivl_design_t
|
|
|
|
|
* type more consistent names.
|
|
|
|
|
*
|
2000-10-13 05:39:27 +02:00
|
|
|
* Revision 1.19 2000/10/13 03:39:27 steve
|
|
|
|
|
* Include constants in nexus targets.
|
|
|
|
|
*
|
2000-10-08 06:01:54 +02:00
|
|
|
* Revision 1.18 2000/10/08 04:01:54 steve
|
|
|
|
|
* Back pointers in the nexus objects into the devices
|
|
|
|
|
* that point to it.
|
|
|
|
|
*
|
|
|
|
|
* Collect threads into a list in the design.
|
|
|
|
|
*
|
2000-10-07 21:45:42 +02:00
|
|
|
* Revision 1.17 2000/10/07 19:45:43 steve
|
|
|
|
|
* Put logic devices into scopes.
|
|
|
|
|
*
|
2000-10-07 01:46:50 +02:00
|
|
|
* Revision 1.16 2000/10/06 23:46:50 steve
|
|
|
|
|
* ivl_target updates, including more complete
|
|
|
|
|
* handling of ivl_nexus_t objects. Much reduced
|
|
|
|
|
* dependencies on pointers to netlist objects.
|
|
|
|
|
*
|
2000-10-05 07:03:01 +02:00
|
|
|
* Revision 1.15 2000/10/05 05:03:01 steve
|
|
|
|
|
* xor and constant devices.
|
|
|
|
|
*
|
2000-09-30 04:18:15 +02:00
|
|
|
* Revision 1.14 2000/09/30 02:18:15 steve
|
|
|
|
|
* ivl_expr_t support for binary operators,
|
|
|
|
|
* Create a proper ivl_scope_t object.
|
2000-08-12 18:34:37 +02:00
|
|
|
*/
|
|
|
|
|
#endif
|