4 * Copyright (c) 1998-2004 Stephen Williams (steve@icarus.com)
6 * This source code is free software; you can redistribute it
7 * and/or modify it in source code form under the terms of the GNU
8 * General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
22 #ident "$Id: PGate.h,v 1.32 2006/04/10 00:37:42 steve Exp $"
26 # include "StringHeap.h"
28 # include "LineInfo.h"
39 * A PGate represents a Verilog gate. The gate has a name and other
40 * properties, and a set of pins that connect to wires. It is known at
41 * the time a gate is constructed how many pins the gate has.
43 * This pins of a gate are connected to expressions. The elaboration
44 * step will need to convert expressions to a network of gates in
45 * order to elaborate expression inputs, but that can easily be done.
47 * The PGate base class also carries the strength0 and strength1
48 * strengths for those gates where the driver[s] can be described by a
49 * single strength pair. There is a strength of the 0 drive, and a
50 * strength of the 1 drive.
52 class PGate
: public LineInfo
{
55 enum strength_t
{ HIGHZ
, WEAK
, PULL
, STRONG
, SUPPLY
};
57 explicit PGate(perm_string name
, svector
<PExpr
*>*pins
,
58 const svector
<PExpr
*>*del
);
60 explicit PGate(perm_string name
, svector
<PExpr
*>*pins
,
63 explicit PGate(perm_string name
, svector
<PExpr
*>*pins
);
67 perm_string
get_name() const { return name_
; }
69 // This method evaluates the delays all the way to an
70 // integer. If the delay is non-constant, then set the times
71 // to 0, print an error message and mark an error to the
73 void eval_delays(Design
*des
, NetScope
*scope
,
74 unsigned long&rise_time
,
75 unsigned long&fall_time
,
76 unsigned long&decay_time
) const;
78 // This evaluates the delays as far as possible, but returns
79 // an expression, and do not signal errors.
80 void eval_delays(Design
*des
, NetScope
*scope
,
84 bool as_net_flag
=false) const;
86 unsigned pin_count() const { return pins_
? pins_
->count() : 0; }
87 const PExpr
*pin(unsigned idx
) const { return (*pins_
)[idx
]; }
89 strength_t
strength0() const;
90 strength_t
strength1() const;
92 void strength0(strength_t
);
93 void strength1(strength_t
);
95 map
<perm_string
,PExpr
*> attributes
;
97 virtual void dump(ostream
&out
, unsigned ind
=4) const;
98 virtual void elaborate(Design
*des
, NetScope
*scope
) const;
99 virtual void elaborate_scope(Design
*des
, NetScope
*sc
) const;
100 virtual bool elaborate_sig(Design
*des
, NetScope
*scope
) const;
103 const svector
<PExpr
*>& get_pins() const { return *pins_
; }
105 void dump_pins(ostream
&out
) const;
106 void dump_delays(ostream
&out
) const;
111 svector
<PExpr
*>*pins_
;
113 strength_t str0_
, str1_
;
115 private: // not implemented
117 PGate
& operator= (const PGate
&);
120 /* A continuous assignment has a single output and a single input. The
121 input is passed directly to the output. This is different from a
122 BUF because elaboration may need to turn this into a vector of
124 class PGAssign
: public PGate
{
127 explicit PGAssign(svector
<PExpr
*>*pins
);
128 explicit PGAssign(svector
<PExpr
*>*pins
, svector
<PExpr
*>*dels
);
131 void dump(ostream
&out
, unsigned ind
=4) const;
132 virtual void elaborate(Design
*des
, NetScope
*scope
) const;
139 * The Builtin class is specifically a gate with one of the builtin
140 * types. The parser recognizes these types during parse. These types
141 * have special properties that allow them to be treated specially.
143 * A PGBuiltin can be grouped into an array of devices. If this is
144 * done, the msb_ and lsb_ are set to the indices of the array
145 * range. Elaboration causes a gate to be created for each element of
146 * the array, and a name will be generated for each gate.
148 class PGBuiltin
: public PGate
{
151 enum Type
{ AND
, NAND
, OR
, NOR
, XOR
, XNOR
, BUF
, BUFIF0
, BUFIF1
,
152 NOT
, NOTIF0
, NOTIF1
, PULLDOWN
, PULLUP
, NMOS
, RNMOS
,
153 PMOS
, RPMOS
, CMOS
, RCMOS
, TRAN
, RTRAN
, TRANIF0
,
154 TRANIF1
, RTRANIF0
, RTRANIF1
};
157 explicit PGBuiltin(Type t
, perm_string name
,
158 svector
<PExpr
*>*pins
,
159 svector
<PExpr
*>*del
);
160 explicit PGBuiltin(Type t
, perm_string name
,
161 svector
<PExpr
*>*pins
,
165 Type
type() const { return type_
; }
166 void set_range(PExpr
*msb
, PExpr
*lsb
);
168 virtual void dump(ostream
&out
, unsigned ind
=4) const;
169 virtual void elaborate(Design
*, NetScope
*scope
) const;
179 * This kind of gate is an instantiation of a module. The stored type
180 * is the name of a module definition somewhere in the pform. This
181 * type also handles UDP devices, because it is generally not known at
182 * parse time whether a name belongs to a module or a UDP.
184 class PGModule
: public PGate
{
187 // The name is the *instance* name of the gate.
189 // If the binding of ports is by position, this constructor
190 // builds everything all at once.
191 explicit PGModule(perm_string type
, perm_string name
,
192 svector
<PExpr
*>*pins
);
194 // If the binding of ports is by name, this constructor takes
195 // the bindings and stores them for later elaboration.
196 explicit PGModule(perm_string type
, perm_string name
,
197 named
<PExpr
*>*pins
, unsigned npins
);
202 // Parameter overrides can come as an ordered list, or a set
203 // of named expressions.
204 void set_parameters(svector
<PExpr
*>*o
);
205 void set_parameters(named
<PExpr
*>*pa
, unsigned npa
);
207 // Modules can be instantiated in ranges. The parser uses this
208 // method to pass the range to the pform.
209 void set_range(PExpr
*msb
, PExpr
*lsb
);
211 virtual void dump(ostream
&out
, unsigned ind
=4) const;
212 virtual void elaborate(Design
*, NetScope
*scope
) const;
213 virtual void elaborate_scope(Design
*des
, NetScope
*sc
) const;
214 virtual bool elaborate_sig(Design
*des
, NetScope
*scope
) const;
216 // This returns the module name of this module. It is a
217 // permallocated string.
218 perm_string
get_type();
222 svector
<PExpr
*>*overrides_
;
226 // These members support parameter override by name
227 named
<PExpr
*>*parms_
;
230 // Arrays of modules are give if these are set.
234 void elaborate_mod_(Design
*, Module
*mod
, NetScope
*scope
) const;
235 void elaborate_udp_(Design
*, PUdp
*udp
, NetScope
*scope
) const;
236 void elaborate_scope_mod_(Design
*des
, Module
*mod
, NetScope
*sc
) const;
237 bool elaborate_sig_mod_(Design
*des
, NetScope
*scope
, Module
*mod
) const;
242 * Revision 1.32 2006/04/10 00:37:42 steve
243 * Add support for generate loops w/ wires and gates.
245 * Revision 1.31 2006/01/03 05:22:14 steve
246 * Handle complex net node delays.
248 * Revision 1.30 2006/01/02 05:33:19 steve
249 * Node delays can be more general expressions in structural contexts.
251 * Revision 1.29 2004/10/04 01:10:52 steve
252 * Clean up spurious trailing white space.
254 * Revision 1.28 2004/03/08 00:47:44 steve
255 * primitive ports can bind bi name.
257 * Revision 1.27 2004/02/20 18:53:33 steve
258 * Addtrbute keys are perm_strings.
260 * Revision 1.26 2004/02/18 17:11:54 steve
261 * Use perm_strings for named langiage items.
263 * Revision 1.25 2003/03/06 04:37:12 steve
264 * lex_strings.add module names earlier.
266 * Revision 1.24 2002/08/12 01:34:58 steve
267 * conditional ident string using autoconfig.
269 * Revision 1.23 2002/05/23 03:08:51 steve
270 * Add language support for Verilog-2001 attribute
271 * syntax. Hook this support into existing $attribute
272 * handling, and add number and void value types.
274 * Add to the ivl_target API new functions for access
275 * of complex attributes attached to gates.
277 * Revision 1.22 2001/11/22 06:20:59 steve
278 * Use NetScope instead of string for scope path.
280 * Revision 1.21 2001/10/21 00:42:47 steve
281 * Module types in pform are char* instead of string.
283 * Revision 1.20 2001/10/19 01:55:32 steve
284 * Method to get the type_ member
286 * Revision 1.19 2001/04/22 23:09:45 steve
287 * More UDP consolidation from Stephan Boettcher.
289 * Revision 1.18 2000/05/06 15:41:56 steve
290 * Carry assignment strength to pform.
292 * Revision 1.17 2000/05/02 16:27:38 steve
293 * Move signal elaboration to a seperate pass.
295 * Revision 1.16 2000/03/29 04:37:10 steve
296 * New and improved combinational primitives.
298 * Revision 1.15 2000/03/08 04:36:53 steve
299 * Redesign the implementation of scopes and parameters.
300 * I now generate the scopes and notice the parameters
301 * in a separate pass over the pform. Once the scopes
302 * are generated, I can process overrides and evalutate
303 * paremeters before elaboration begins.
305 * Revision 1.14 2000/02/23 02:56:53 steve
306 * Macintosh compilers do not support ident.
308 * Revision 1.13 2000/02/18 05:15:02 steve
309 * Catch module instantiation arrays.
311 * Revision 1.12 2000/01/09 05:50:48 steve
312 * Support named parameter override lists.
314 * Revision 1.11 1999/12/11 05:45:41 steve
315 * Fix support for attaching attributes to primitive gates.
317 * Revision 1.10 1999/09/04 19:11:46 steve
318 * Add support for delayed non-blocking assignments.
320 * Revision 1.9 1999/08/23 16:48:39 steve
321 * Parameter overrides support from Peter Monta
322 * AND and XOR support wide expressions.
324 * Revision 1.8 1999/08/01 21:18:55 steve
325 * elaborate rise/fall/decay for continuous assign.
327 * Revision 1.7 1999/08/01 16:34:50 steve
328 * Parse and elaborate rise/fall/decay times
329 * for gates, and handle the rules for partial
332 * Revision 1.6 1999/05/29 02:36:17 steve
333 * module parameter bind by name.
335 * Revision 1.5 1999/05/10 00:16:58 steve
336 * Parse and elaborate the concatenate operator
337 * in structural contexts, Replace vector<PExpr*>
338 * and list<PExpr*> with svector<PExpr*>, evaluate
339 * constant expressions with parameters, handle
340 * memories as lvalues.
342 * Parse task declarations, integer types.
344 * Revision 1.4 1999/02/15 02:06:15 steve
345 * Elaborate gate ranges.
347 * Revision 1.3 1999/01/25 05:45:56 steve
348 * Add the LineInfo class to carry the source file
349 * location of things. PGate, Statement and PProcess.
351 * elaborate handles module parameter mismatches,
352 * missing or incorrect lvalues for procedural
353 * assignment, and errors are propogated to the
354 * top of the elaboration call tree.
356 * Attach line numbers to processes, gates and
357 * assignment statements.
359 * Revision 1.2 1998/12/01 00:42:13 steve
360 * Elaborate UDP devices,
361 * Support UDP type attributes, and
362 * pass those attributes to nodes that
363 * are instantiated by elaboration,
364 * Put modules into a map instead of
367 * Revision 1.1 1998/11/03 23:28:54 steve
368 * Introduce verilog to CVS.