1998-11-04 00:28:49 +01:00
|
|
|
#ifndef __pform_H
|
|
|
|
|
#define __pform_H
|
|
|
|
|
/*
|
2000-02-23 03:56:53 +01:00
|
|
|
* Copyright (c) 1998-2000 Stephen Williams (steve@icarus.com)
|
1998-11-04 00:28:49 +01:00
|
|
|
*
|
|
|
|
|
* 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
|
|
|
|
|
*/
|
2002-08-12 03:34:58 +02:00
|
|
|
#ifdef HAVE_CVS_IDENT
|
2007-05-24 06:07:11 +02:00
|
|
|
#ident "$Id: pform.h,v 1.91 2007/05/24 04:07:12 steve Exp $"
|
1998-11-04 00:28:49 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
# include "netlist.h"
|
2001-12-03 05:47:14 +01:00
|
|
|
# include "HName.h"
|
2000-01-09 06:50:48 +01:00
|
|
|
# include "named.h"
|
1998-11-04 00:28:49 +01:00
|
|
|
# include "Module.h"
|
|
|
|
|
# include "Statement.h"
|
|
|
|
|
# include "PGate.h"
|
|
|
|
|
# include "PExpr.h"
|
1999-07-03 04:12:51 +02:00
|
|
|
# include "PTask.h"
|
1998-11-25 03:35:53 +01:00
|
|
|
# include "PUdp.h"
|
1998-11-04 00:28:49 +01:00
|
|
|
# include "PWire.h"
|
|
|
|
|
# include "verinum.h"
|
2002-06-06 20:57:18 +02:00
|
|
|
# include <iostream>
|
1998-11-04 00:28:49 +01:00
|
|
|
# include <string>
|
|
|
|
|
# include <list>
|
|
|
|
|
# include <stdio.h>
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* These classes implement the parsed form (P-form for short) of the
|
2008-01-29 21:19:59 +01:00
|
|
|
* original Verilog source. the parser generates the pform for the
|
1998-11-04 00:28:49 +01:00
|
|
|
* convenience of later processing steps.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Wire objects represent the named wires (of various flavor) declared
|
|
|
|
|
* in the source.
|
|
|
|
|
*
|
|
|
|
|
* Gate objects are the functional modules that are connected together
|
|
|
|
|
* by wires.
|
|
|
|
|
*
|
|
|
|
|
* Wires and gates, connected by joints, represent a netlist. The
|
|
|
|
|
* netlist is therefore a representation of the desired circuit.
|
|
|
|
|
*/
|
|
|
|
|
class PGate;
|
|
|
|
|
class PExpr;
|
2006-09-23 06:57:19 +02:00
|
|
|
class PSpecPath;
|
1999-06-02 17:38:46 +02:00
|
|
|
struct vlltype;
|
1998-11-04 00:28:49 +01:00
|
|
|
|
2000-07-29 19:58:20 +02:00
|
|
|
/*
|
|
|
|
|
* The min:typ:max expression s selected at parse time using the
|
2003-01-30 17:23:07 +01:00
|
|
|
* enumeration. When the compiler makes a choice, it also prints a
|
2000-07-29 19:58:20 +02:00
|
|
|
* warning if min_typ_max_warn > 0.
|
|
|
|
|
*/
|
|
|
|
|
extern enum MIN_TYP_MAX { MIN, TYP, MAX } min_typ_max_flag;
|
|
|
|
|
extern unsigned min_typ_max_warn;
|
|
|
|
|
PExpr* pform_select_mtm_expr(PExpr*min, PExpr*typ, PExpr*max);
|
|
|
|
|
|
2007-04-19 04:52:53 +02:00
|
|
|
/*
|
|
|
|
|
* This flag is true if the lexor thinks we are in a library source
|
|
|
|
|
* file.
|
|
|
|
|
*/
|
|
|
|
|
extern bool pform_library_flag;
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
/*
|
|
|
|
|
* These type are lexical types -- that is, types that are used as
|
|
|
|
|
* lexical values to decorate the parse tree during parsing. They are
|
|
|
|
|
* not in any way preserved once parsing is done.
|
|
|
|
|
*/
|
|
|
|
|
|
1999-05-29 04:36:17 +02:00
|
|
|
/* This is information about port name information for named port
|
|
|
|
|
connections. */
|
2000-01-09 06:50:48 +01:00
|
|
|
|
2005-12-05 22:21:18 +01:00
|
|
|
//typedef struct named<PExpr*> named_pexpr_t;
|
|
|
|
|
typedef named<PExpr*> named_pexpr_t;
|
2000-01-09 06:50:48 +01:00
|
|
|
|
|
|
|
|
struct parmvalue_t {
|
|
|
|
|
svector<PExpr*>*by_order;
|
2002-05-23 05:08:50 +02:00
|
|
|
svector<named_pexpr_t*>*by_name;
|
1999-05-29 04:36:17 +02:00
|
|
|
};
|
|
|
|
|
|
2000-05-06 17:41:56 +02:00
|
|
|
struct str_pair_t { PGate::strength_t str0, str1; };
|
|
|
|
|
|
2001-11-29 18:37:51 +01:00
|
|
|
struct net_decl_assign_t {
|
2008-02-25 04:40:54 +01:00
|
|
|
perm_string name;
|
2001-11-29 18:37:51 +01:00
|
|
|
PExpr*expr;
|
|
|
|
|
struct net_decl_assign_t*next;
|
|
|
|
|
};
|
|
|
|
|
|
1999-05-29 04:36:17 +02:00
|
|
|
/* The lgate is gate instantiation information. */
|
1998-11-04 00:28:49 +01:00
|
|
|
struct lgate {
|
1999-05-06 06:37:17 +02:00
|
|
|
lgate(int =0)
|
1999-05-29 04:36:17 +02:00
|
|
|
: parms(0), parms_by_name(0), lineno(0)
|
1999-02-15 03:06:15 +01:00
|
|
|
{ range[0] = 0;
|
|
|
|
|
range[1] = 0;
|
|
|
|
|
}
|
1999-01-25 06:45:56 +01:00
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
string name;
|
1999-05-10 02:16:57 +02:00
|
|
|
svector<PExpr*>*parms;
|
2002-05-23 05:08:50 +02:00
|
|
|
svector<named_pexpr_t*>*parms_by_name;
|
1999-01-25 06:45:56 +01:00
|
|
|
|
1999-02-15 03:06:15 +01:00
|
|
|
PExpr*range[2];
|
|
|
|
|
|
2000-11-30 18:31:42 +01:00
|
|
|
const char* file;
|
1999-01-25 06:45:56 +01:00
|
|
|
unsigned lineno;
|
1998-11-04 00:28:49 +01:00
|
|
|
};
|
|
|
|
|
|
2004-06-13 06:56:53 +02:00
|
|
|
/* The lexor calls this function to change the default nettype. */
|
|
|
|
|
extern void pform_set_default_nettype(NetNet::Type net,
|
|
|
|
|
const char*file,
|
|
|
|
|
unsigned lineno);
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
/*
|
|
|
|
|
* The parser uses startmodule and endmodule together to build up a
|
|
|
|
|
* module as it parses it. The startmodule tells the pform code that a
|
|
|
|
|
* module has been noticed in the source file and the following events
|
|
|
|
|
* are to apply to the scope of that module. The endmodule causes the
|
|
|
|
|
* pform to close up and finish the named module.
|
|
|
|
|
*/
|
2003-06-20 02:53:19 +02:00
|
|
|
extern void pform_startmodule(const char*, const char*file, unsigned lineno,
|
|
|
|
|
svector<named_pexpr_t*>*attr);
|
2002-05-20 01:37:28 +02:00
|
|
|
extern void pform_module_set_ports(svector<Module::port_t*>*);
|
2002-05-20 04:06:01 +02:00
|
|
|
|
|
|
|
|
/* This function is used to support the port definition in a
|
|
|
|
|
port_definition_list. In this case, we have everything needed to
|
|
|
|
|
define the port, all in one place. */
|
|
|
|
|
extern void pform_module_define_port(const struct vlltype&li,
|
2008-02-25 04:40:54 +01:00
|
|
|
perm_string name,
|
2002-05-20 04:06:01 +02:00
|
|
|
NetNet::PortType,
|
|
|
|
|
NetNet::Type type,
|
|
|
|
|
bool signed_flag,
|
2003-07-04 05:57:18 +02:00
|
|
|
svector<PExpr*>*range,
|
|
|
|
|
svector<named_pexpr_t*>*attr);
|
2002-05-20 04:06:01 +02:00
|
|
|
|
2008-02-25 04:40:54 +01:00
|
|
|
extern Module::port_t* pform_module_port_reference(perm_string name,
|
2002-05-20 01:37:28 +02:00
|
|
|
const char*file,
|
|
|
|
|
unsigned lineno);
|
2001-10-20 07:21:51 +02:00
|
|
|
extern void pform_endmodule(const char*);
|
1998-11-04 00:28:49 +01:00
|
|
|
|
2008-02-25 04:40:54 +01:00
|
|
|
extern void pform_make_udp(perm_string name, list<perm_string>*parms,
|
1999-06-12 22:35:27 +02:00
|
|
|
svector<PWire*>*decl, list<string>*table,
|
2001-10-21 03:55:24 +02:00
|
|
|
Statement*init,
|
|
|
|
|
const char*file, unsigned lineno);
|
1998-11-25 03:35:53 +01:00
|
|
|
|
2004-03-08 01:10:29 +01:00
|
|
|
extern void pform_make_udp(perm_string name,
|
|
|
|
|
bool sync_flag, perm_string out_name,
|
|
|
|
|
PExpr*sync_init,
|
|
|
|
|
list<perm_string>*parms,
|
|
|
|
|
list<string>*table,
|
|
|
|
|
const char*file, unsigned lineno);
|
|
|
|
|
|
1999-06-24 06:24:18 +02:00
|
|
|
/*
|
2001-12-03 05:47:14 +01:00
|
|
|
* Enter/exit name scopes. The push_scope function pushes the scope
|
|
|
|
|
* name string onto the scope hierarchy. The pop pulls it off and
|
|
|
|
|
* deletes it. Thus, the string pushed must be allocated.
|
1999-06-24 06:24:18 +02:00
|
|
|
*/
|
|
|
|
|
extern void pform_pop_scope();
|
|
|
|
|
|
2008-02-16 06:20:24 +01:00
|
|
|
extern PTask*pform_push_task_scope(char*name);
|
|
|
|
|
extern PFunction*pform_push_function_scope(char*name);
|
|
|
|
|
extern PBlock*pform_push_block_scope(char*name, PBlock::BL_TYPE tt);
|
|
|
|
|
|
2003-04-14 05:37:47 +02:00
|
|
|
|
|
|
|
|
extern verinum* pform_verinum_with_size(verinum*s, verinum*val,
|
|
|
|
|
const char*file, unsigned loneno);
|
|
|
|
|
|
2006-04-10 02:37:42 +02:00
|
|
|
/*
|
|
|
|
|
* This function takes the list of names as new genvars to declare in
|
|
|
|
|
* the current module scope.
|
|
|
|
|
*/
|
|
|
|
|
extern void pform_genvars(list<perm_string>*names);
|
|
|
|
|
|
|
|
|
|
extern void pform_start_generate_for(const struct vlltype&li,
|
|
|
|
|
char*ident1,
|
|
|
|
|
PExpr*init,
|
|
|
|
|
PExpr*test,
|
|
|
|
|
char*ident2,
|
|
|
|
|
PExpr*next);
|
2007-06-22 04:04:48 +02:00
|
|
|
extern void pform_start_generate_if(const struct vlltype&li, PExpr*test);
|
|
|
|
|
extern void pform_start_generate_else(const struct vlltype&li);
|
2008-02-10 07:19:42 +01:00
|
|
|
extern void pform_start_generate_case(const struct vlltype&lp, PExpr*test);
|
|
|
|
|
extern void pform_generate_case_item(const struct vlltype&lp, PExpr*test);
|
2006-04-10 02:37:42 +02:00
|
|
|
extern void pform_generate_block_name(char*name);
|
|
|
|
|
extern void pform_endgenerate();
|
|
|
|
|
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
/*
|
|
|
|
|
* The makewire functions announce to the pform code new wires. These
|
|
|
|
|
* go into a module that is currently opened.
|
|
|
|
|
*/
|
2008-02-25 04:40:54 +01:00
|
|
|
extern void pform_makewire(const struct vlltype&li, perm_string name,
|
2005-07-07 18:22:49 +02:00
|
|
|
NetNet::Type type,
|
|
|
|
|
NetNet::PortType pt,
|
|
|
|
|
ivl_variable_type_t,
|
2002-05-24 06:36:23 +02:00
|
|
|
svector<named_pexpr_t*>*attr);
|
2002-05-20 04:06:01 +02:00
|
|
|
|
2005-07-07 18:22:49 +02:00
|
|
|
/* This form handles simple declarations */
|
2000-10-31 18:00:04 +01:00
|
|
|
extern void pform_makewire(const struct vlltype&li,
|
|
|
|
|
svector<PExpr*>*range,
|
2003-02-02 20:02:39 +01:00
|
|
|
bool signed_flag,
|
2004-05-25 21:21:06 +02:00
|
|
|
list<perm_string>*names,
|
2002-05-24 06:36:23 +02:00
|
|
|
NetNet::Type type,
|
2003-04-28 19:50:57 +02:00
|
|
|
NetNet::PortType,
|
2005-07-07 18:22:49 +02:00
|
|
|
ivl_variable_type_t,
|
2007-08-22 04:52:42 +02:00
|
|
|
svector<named_pexpr_t*>*attr,
|
|
|
|
|
PWSRType rt = SR_NET);
|
2005-07-07 18:22:49 +02:00
|
|
|
|
|
|
|
|
/* This form handles assignment declarations. */
|
2001-11-29 18:37:51 +01:00
|
|
|
extern void pform_makewire(const struct vlltype&li,
|
|
|
|
|
svector<PExpr*>*range,
|
2003-02-02 20:02:39 +01:00
|
|
|
bool signed_flag,
|
2001-11-29 18:37:51 +01:00
|
|
|
svector<PExpr*>*delay,
|
2002-01-12 05:03:39 +01:00
|
|
|
str_pair_t str,
|
2001-11-29 18:37:51 +01:00
|
|
|
net_decl_assign_t*assign_list,
|
2005-07-07 18:22:49 +02:00
|
|
|
NetNet::Type type,
|
|
|
|
|
ivl_variable_type_t);
|
|
|
|
|
|
1999-12-30 20:06:14 +01:00
|
|
|
extern void pform_make_reginit(const struct vlltype&li,
|
2008-02-25 04:40:54 +01:00
|
|
|
perm_string name, PExpr*expr);
|
2002-05-20 01:37:28 +02:00
|
|
|
|
|
|
|
|
/* Look up the names of the wires, and set the port type,
|
|
|
|
|
i.e. input, output or inout. If the wire does not exist, create
|
|
|
|
|
it. The second form takes a single name. */
|
2001-11-10 03:08:49 +01:00
|
|
|
extern void pform_set_port_type(const struct vlltype&li,
|
2004-05-25 21:21:06 +02:00
|
|
|
list<perm_string>*names,
|
2003-02-02 20:02:39 +01:00
|
|
|
svector<PExpr*>*range,
|
|
|
|
|
bool signed_flag,
|
2000-10-31 18:00:04 +01:00
|
|
|
NetNet::PortType);
|
2004-05-25 21:21:06 +02:00
|
|
|
extern void pform_set_port_type(perm_string nm, NetNet::PortType pt,
|
2002-05-20 01:37:28 +02:00
|
|
|
const char*file, unsigned lineno);
|
|
|
|
|
|
2004-05-25 21:21:06 +02:00
|
|
|
extern void pform_set_net_range(list<perm_string>*names,
|
2005-07-07 18:22:49 +02:00
|
|
|
svector<PExpr*>*,
|
|
|
|
|
bool signed_flag,
|
2007-08-22 04:52:42 +02:00
|
|
|
ivl_variable_type_t,
|
|
|
|
|
PWSRType rt = SR_NET);
|
2008-02-25 04:40:54 +01:00
|
|
|
extern void pform_set_reg_idx(perm_string name, PExpr*l, PExpr*r);
|
2004-05-25 21:21:06 +02:00
|
|
|
extern void pform_set_reg_integer(list<perm_string>*names);
|
|
|
|
|
extern void pform_set_reg_time(list<perm_string>*names);
|
2002-05-23 05:08:50 +02:00
|
|
|
|
|
|
|
|
/* pform_set_attrib and pform_set_type_attrib exist to support the
|
|
|
|
|
$attribute syntax, which can only set string values to
|
|
|
|
|
attributes. The functions keep the value strings that are
|
|
|
|
|
passed in. */
|
2004-02-20 19:53:33 +01:00
|
|
|
extern void pform_set_attrib(perm_string name, perm_string key,
|
2002-05-23 05:08:50 +02:00
|
|
|
char*value);
|
2004-02-18 18:11:54 +01:00
|
|
|
extern void pform_set_type_attrib(perm_string name, const string&key,
|
2002-05-23 05:08:50 +02:00
|
|
|
char*value);
|
|
|
|
|
|
2004-02-20 07:22:56 +01:00
|
|
|
extern void pform_set_parameter(perm_string name,
|
2002-09-01 05:01:48 +02:00
|
|
|
bool signed_flag,
|
2002-08-19 04:39:16 +02:00
|
|
|
svector<PExpr*>*range,
|
|
|
|
|
PExpr*expr);
|
2004-08-26 06:02:03 +02:00
|
|
|
extern void pform_set_localparam(perm_string name,
|
|
|
|
|
bool signed_flag,
|
|
|
|
|
svector<PExpr*>*range,
|
|
|
|
|
PExpr*expr);
|
2007-05-24 06:07:11 +02:00
|
|
|
extern void pform_set_defparam(const pform_name_t&name, PExpr*expr);
|
2002-05-26 03:39:02 +02:00
|
|
|
|
2003-02-27 07:45:11 +01:00
|
|
|
/*
|
|
|
|
|
* Functions related to specify blocks.
|
|
|
|
|
*/
|
2004-05-25 21:21:06 +02:00
|
|
|
extern void pform_set_specparam(perm_string name, PExpr*expr);
|
2006-09-23 06:57:19 +02:00
|
|
|
|
|
|
|
|
extern PSpecPath*pform_make_specify_path(const struct vlltype&li,
|
|
|
|
|
list<perm_string>*src, char pol,
|
|
|
|
|
bool full_flag, list<perm_string>*dst);
|
2007-02-12 02:52:21 +01:00
|
|
|
extern PSpecPath*pform_make_specify_edge_path(const struct vlltype&li,
|
2007-04-13 04:34:35 +02:00
|
|
|
int edge_flag, /*posedge==true */
|
2007-02-12 02:52:21 +01:00
|
|
|
list<perm_string>*src, char pol,
|
|
|
|
|
bool full_flag, list<perm_string>*dst,
|
|
|
|
|
PExpr*data_source_expression);
|
2006-09-23 06:57:19 +02:00
|
|
|
extern PSpecPath*pform_assign_path_delay(PSpecPath*obj, svector<PExpr*>*delays);
|
2007-02-12 02:52:21 +01:00
|
|
|
|
2006-09-23 06:57:19 +02:00
|
|
|
extern void pform_module_specify_path(PSpecPath*obj);
|
2003-02-27 07:45:11 +01:00
|
|
|
|
2002-05-26 03:39:02 +02:00
|
|
|
/*
|
|
|
|
|
* pform_make_behavior creates processes that are declared with always
|
|
|
|
|
* or initial items.
|
|
|
|
|
*/
|
|
|
|
|
extern PProcess* pform_make_behavior(PProcess::Type, Statement*,
|
|
|
|
|
svector<named_pexpr_t*>*attr);
|
1998-11-04 00:28:49 +01:00
|
|
|
|
2004-05-25 21:21:06 +02:00
|
|
|
extern svector<PWire*>* pform_make_udp_input_ports(list<perm_string>*);
|
1998-11-25 03:35:53 +01:00
|
|
|
|
1999-05-16 07:08:42 +02:00
|
|
|
extern bool pform_expression_is_constant(const PExpr*);
|
|
|
|
|
|
2004-05-25 21:21:06 +02:00
|
|
|
extern void pform_make_events(list<perm_string>*names,
|
2000-11-30 18:31:42 +01:00
|
|
|
const char*file, unsigned lineno);
|
2003-01-26 22:15:58 +01:00
|
|
|
/*
|
|
|
|
|
* Make real datum objects.
|
|
|
|
|
*/
|
2004-05-25 21:21:06 +02:00
|
|
|
extern void pform_make_reals(list<perm_string>*names,
|
2003-01-26 22:15:58 +01:00
|
|
|
const char*file, unsigned lineno);
|
2000-04-01 21:31:57 +02:00
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
/*
|
|
|
|
|
* The makegate function creates a new gate (which need not have a
|
|
|
|
|
* name) and connects it to the specified wires.
|
|
|
|
|
*/
|
|
|
|
|
extern void pform_makegates(PGBuiltin::Type type,
|
2000-05-08 07:30:19 +02:00
|
|
|
struct str_pair_t str,
|
1999-08-01 18:34:50 +02:00
|
|
|
svector<PExpr*>*delay,
|
2002-05-23 05:08:50 +02:00
|
|
|
svector<lgate>*gates,
|
|
|
|
|
svector<named_pexpr_t*>*attr);
|
1998-11-04 00:28:49 +01:00
|
|
|
|
2004-02-18 18:11:54 +01:00
|
|
|
extern void pform_make_modgates(perm_string type,
|
2000-01-09 06:50:48 +01:00
|
|
|
struct parmvalue_t*overrides,
|
1999-08-23 18:48:39 +02:00
|
|
|
svector<lgate>*gates);
|
1998-11-04 00:28:49 +01:00
|
|
|
|
|
|
|
|
/* Make a continuous assignment node, with optional bit- or part- select. */
|
1999-08-27 17:08:37 +02:00
|
|
|
extern void pform_make_pgassign_list(svector<PExpr*>*alist,
|
|
|
|
|
svector<PExpr*>*del,
|
2000-05-06 17:41:56 +02:00
|
|
|
struct str_pair_t str,
|
2000-11-30 18:31:42 +01:00
|
|
|
const char* fn, unsigned lineno);
|
1999-07-24 04:11:19 +02:00
|
|
|
|
|
|
|
|
/* Given a port type and a list of names, make a list of wires that
|
|
|
|
|
can be used as task port information. */
|
|
|
|
|
extern svector<PWire*>*pform_make_task_ports(NetNet::PortType pt,
|
2006-03-30 07:22:34 +02:00
|
|
|
ivl_variable_type_t vtype,
|
2003-06-13 02:27:09 +02:00
|
|
|
bool signed_flag,
|
2000-10-31 18:00:04 +01:00
|
|
|
svector<PExpr*>*range,
|
2004-05-25 21:21:06 +02:00
|
|
|
list<perm_string>*names,
|
2000-11-30 18:31:42 +01:00
|
|
|
const char* file,
|
1999-09-10 07:02:09 +02:00
|
|
|
unsigned lineno);
|
1999-07-24 04:11:19 +02:00
|
|
|
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
/*
|
|
|
|
|
* These are functions that the outside-the-parser code uses the do
|
2008-01-29 21:19:59 +01:00
|
|
|
* interesting things to the Verilog. The parse function reads and
|
1998-11-04 00:28:49 +01:00
|
|
|
* parses the source file and places all the modules it finds into the
|
|
|
|
|
* mod list. The dump function dumps a module to the output stream.
|
|
|
|
|
*/
|
|
|
|
|
extern void pform_dump(ostream&out, Module*mod);
|
|
|
|
|
|
|
|
|
|
/*
|
2007-08-17 19:10:28 +02:00
|
|
|
* Used to report the original module location when a nested module
|
|
|
|
|
* (missing endmodule) is found by the parser.
|
1998-11-04 00:28:49 +01:00
|
|
|
*/
|
2007-08-17 19:10:28 +02:00
|
|
|
extern void pform_error_nested_modules();
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
#endif
|