A design that is targeted for simulation has parts for which simulation models are available and configured.
When creating designs for simulation, some of the parts you use are for simulation only (simulation stimulus parts like voltage sources), and some of the parts you use have simulation models that only model some of the pins of a real device.
The parts that are to be used for simulation have a SIMULATIONONLY property. You can add this (or any) property to your own custom parts to make them simulation-only.
The remaining topics cover:
- Adding PSpice Libraries and Parts
- Defining Part Properties Needed for Simulation
- Guidelines and Best Practices for Specifying Values for Part Properties
- Placing PSpice Ground 0 Symbols for PSpice Simulations
- Using the FLOAT Property for Unconnected Pins
- Using Global Parameters and Expressions
- Defining Stimuli
Adding PSpice Libraries and Parts
The PSpice part libraries (.OLB
files) are located in the tools\capture\library\pspice
directory, under your main installation directory. The simulation model libraries (.lib
files) are located under the tools\pspice\library
directory.
If you wish to add more PSpice part libraries to your design, you can do so by using the Place Part dialog box (choose Place – Part or use the Place Part toolbar button). Then add the library you need by selecting it from the tools\capture\library\pspice
sub-directory. The PSpice libraries located in the pspice
sub-directory include:
- vendor-supplied parts
- passive parts
- breakout parts
- behavioral parts
- special simulation-only parts
When you select a part in the Place Part dialog box, the PSpice symbol (
) appears for a part that can be simulated.You can also add more PSpice Parts using PSpice Part Search (choose Place - PSpice Component - Search).
At minimum, a part that you can simulate has these properties:
- A simulation model to describe the part's electrical behavior; the model can be:
- explicitly defined in a model library,
- built into PSpice, or
- built into the part (for some kinds of analog behavioral parts).
- A part with modeled pins to form electrical connections on your schematic.
- A translation from the design part to the netlist statement so that PSpice can read it in.
Not all parts in the libraries are set up for simulation. For example, connectors are parts destined only for board layout and do not have these simulation properties. The libraries contained in the pspice subfolder are the only ones set up for simulation.
You must use the 0 (zero) ground part in designs intended to be simulated by PSpice. If you have used other ground parts, you can rename them to 0 so that they will be accepted by PSpice. (See Placing PSpice Ground 0 Symbols for PSpice Simulations )
Special simulation-only parts
The PSpice part libraries also include special parts that you can use only for simulation. These include:
- stimulus parts to generate input signals to the circuit (see Defining Stimuli)
- ground parts required by all analog and mixed-signal circuits, which need reference to the ground
- simulation control parts to do things like set bias values
- output control parts for generating tables and line-printer plots to the PSpice output file
Vendor-supplied parts
The PSpice libraries provide an extensive selection of manufacturers' analog and digital parts. Typically, the library name reflects the kind of parts contained in the library and the vendor that provided the models.
Libraries are provided with PSpice:
- Standard PSpice libraries
Standard PSpice libraries
The standard PSpice libraries are installed in the following locations in the installation directory:
- Capture symbols for standard PSpice libraries at \tools\capture\library\pspice
- Standard PSpice model libraries at \tools\psice\library\
To find out more about each model library, read the comments in the .LIB file header.
Part naming conventions
The part names in the PSpice libraries usually reflect the manufacturers' part names. If multiple vendors supply the same part, each part name includes a suffix that indicates the vendor that supplied the model.
To find parts using the part browser:
- In Capture, choose Place – Part.
-
In the Part Name field, type a text string with wildcard characters that approximates the part name that you want to find. Use this syntax:
<wildcard><part_name_fragment><wildcard>
where <wildcard> is one of the following:* match zero or more characters ? match exactly one character The parts browser displays only the matching part names.
This method finds any part contained in the current part libraries configuration, including parts for user-defined models.
To find parts using PSpice Part Search:
You can also search for PSpice parts using PSpice Part Search. For more information, see the Searching and Placing PSpice Parts section.
Passive parts
The PSpice libraries supply several basic parts based on the passive device models built into PSpice. These are summarized in the following table.
To find out more about how to use these parts and define their properties, look up the corresponding PSpice device letter in the Analog Devices chapter in the online PSpice Reference Manual, and then see the Capture Parts sections.
Available Parts | Device Type | PSpice Device Letter... |
---|---|---|
C C_VAR | capacitor | C |
L | inductor | L |
R R_VAR | resistor | R |
XFRM_LINEAR K_LINEAR | transformer | K and L |
T | ideal transmission line | T |
TLOSSY | Lossy transmission line | T |
TnCOUPLED TnCOUPLEDX* KCOUPLEn* | coupled transmission line | T and K |
*For these device types, the PSpice libraries supply several parts. Refer to the online PSpice Reference Manual for the available parts.
Breakout parts
The PSpice libraries supply passive and semiconductor parts with default model definitions that define a basic set of model parameters. This way, you can easily:
- assign device and lot tolerances to model parameters for Monte Carlo and sensitivity/worst-case analyses
- define temperature coefficients
- define device-specific operating temperatures
These are called breakout parts and are summarized in the following table.
To find out more about how to use these parts and define their properties, look up the corresponding PSpice device letter in the Analog Devices chapter in the online PSpice Reference Manual, and then see the Capture Parts sections.
Breakout Part | Device Type | PSpice Device Letter |
---|---|---|
BBREAK | GaAsFET | B |
CBREAK | capacitor | C |
DBREAKx | diode | D |
JBREAKx* | JFET | J |
KBREAK | inductor coupling | K |
LBREAK | inductor | L |
MBREAKx* | MOSFET | M |
QBREAKx* | bipolar transistor | Q |
RBREAK | resistor | R |
SBREAK | voltage-controlled switch | S |
TBREAK | transmission line | T |
WBREAK | current-controlled switch | W |
XFRM_NONLINEAR | transformer | K and L |
ZBREAKN | IGBT | Z |
* For this device type, the PSpice libraries supply several breakout parts. Refer to the online PSpice Reference Manual for the available parts.
Behavioral parts
Behavioral parts allow you to define how a block of circuitry should work without having to define each discrete component.
Analog behavioral parts
These parts use analog behavioral modeling (ABM) to define each part's behavior as a mathematical expression or lookup table. The PSpice libraries provide ABM parts that operate as math functions, limiters, Chebyshev filters, integrators, differentiators, and others that you can customize for specific expressions and lookup tables. You can also create your own ABM parts.
Digital behavioral parts
These parts use special behavioral primitives to define each part's functional and timing behavior. These primitives are:
LOGICEXP | to define logic expressions |
PINDLY | to define pin-to-pin delays |
CONSTRAINT | to define constraint checks |
Many of the digital parts provided in the PSpice libraries are modeled using these primitives. You can also create your own digital behavioral parts using these primitives.
Defining Part Properties Needed for Simulation
If you want to use a part for simulation, then your part should have the PSPICETEMPLATE property defined for it:
You can also add other simulation-specific properties for digital parts: IO_LEVEL, MNTYMXDLY, and PSPICEDEFAULTNET.
Here are the things to check when editing part properties:
- Does the property specify the correct number of pins/ nodes?
- Are the pins/ nodes in the specified property in the proper order?
- Do the pin/ node names in the property match the pin names on the part?
For examples of how to use the property, see PSPICETEMPLATE examples.
Editing simulation properties
To edit a property needed for simulation
- In the schematic page editor, select the part to edit.
- From the Edit menu, choose Properties to display the Parts spreadsheet of the Property Editor.
- Click on the cell of the column you want to change, or click the New button to add a property (and type the property name in the Name field).
- If needed, type a value in the Value text box.
- Click Apply to update the design, then close the spreadsheet.
PSPICETEMPLATE property
The PSPICETEMPLATE property defines the PSpice syntax for the part's netlist entry. When creating a netlist, Capture substitutes actual values from the circuit into the appropriate places in the PSPICETEMPLATE syntax, then saves the translated statement to the netlist file.
Any part that you want to simulate must have a defined PSPICETEMPLATE property. These rules apply:
- The pin names specified in the PSPICETEMPLATE property must match the pin names on the part.
- The number and order of the pins listed in the PSPICETEMPLATE property must match those for the associated .MODEL or .SUBCKT definition referenced for simulation.
- The first character in a PSPICETEMPLATE must be a PSpice device letter appropriate for the part (such as Q for a bipolar transistor).
PSPICETEMPLATE syntax
The PSPICETEMPLATE contains:
- regular characters that the schematic page editor interprets verbatim, and
- property names and control characters that the schematic page editor translates.
Regular characters in template
Regular characters include the following:
- alphanumerics
- any keyboard part except the special syntactical parts used with attributes (@ & ? ~ #)
- whitespace
An identifier is a collection of regular characters of the form:
alphabetic character [any other regular character]*.
Property names in templates
Property names are preceded by a special character as follows:
[ @ | ? | ~ | # | & ]<identifier>
The schematic page editor processes the property according to the special character as shown in the following table.
Syntax* | Replacement |
---|---|
@<id> | Value of <id>. Error if no <id> property or if no value assigned. |
&<id> | Value of <id>, if <id> is defined. |
?<id>s...s | Text between s...s separators, if <id> is defined. |
?<id>s...ss...s | Text between the first s...s separators, if <id> is defined, else the second s...s clause. |
~<id>s...s | Text between s...s separators, if <id> is undefined. |
~<id> s...ss...s | Text between the first s...s separators, if <id> is undefined, else the second s...s clause. |
#<id>s...s | Text between s...s separators, if <id> is defined, but delete rest of template if <id> is undefined. |
*s is a separator character.
Separator characters include commas (,), periods (.), semi-colons (;), forward slashes (/), and vertical bars ( | ). You must always use the same character to specify an opening-closing pair of separators.
You can use different separator characters to nest conditional property clauses.
The caret (^) character in templates
The schematic page editor replaces the caret (^) character with the complete hierarchical path to the device being netlisted.
The new line (\n) character sequence in templates
The part editor replaces the new line (\n) character sequence with a new line. Using newline character sequence (\n), you can specify a multiline netlist entry from a one-line template.
The percentage (%) character and pin names in templates
Pin names are denoted as follows:
%<pin name>
where pin name is one or more regular characters.
The schematic page editor replaces the %<pin name> clause in the template with the name of the net connected to that pin.
The end of the pin name is marked with a separator. To avoid name conflicts in PSpice, the schematic page editor translates the following characters contained in pin names.
Pin name character | Replacement |
---|---|
< | l (L) |
> | g |
= | e |
\XXX\ | XXXbar |
To include a literal percentage (%) character into the netlist output, type the percentage symbol twice (%%) in the template.
Recommended scheme for netlist templates
Templates for devices in the part library start with a PSpice device letter, followed by the hierarchical path, and then the reference designator (REFDES) property. We recommend that you adopt this scheme when defining your own netlist templates.
PSPICETEMPLATE examples
Simple resistor (R) template
The R part has two pins (1 and 2) and two required properties, REFDES and VALUE.
The template for the resistor is:
R^@REFDES %1 %2 @VALUE
A sample translation of the template is:
R_R23 abc def 1k
where REFDES equals R23, VALUE equals 1k, and R is connected to nets abc and def.
Voltage source with optional AC and DC specifications (VAC) template
The VAC part has two properties, AC and DC, and two pins, + and -.
The template is:
V^@REFDES %+ %- ?DC|DC=@DC| ?AC|AC=@AC|
A sample translation of the template is:
V_V6 vp vm DC=5v
where REFDES equals V6, VSRC is connected to nodes vp and vm, DC is set to 5v, and AC is undefined.
Another sample translation of the template is:
V_V6 vp vm DC=5v AC=1v
where, in addition to the settings for the previous translation, AC is set to 1v.
Parameterized subcircuit call (X) template
This example supposes a subcircuit Z that has two pins (a and b) and a subcircuit parameter G, where G defaults to 1000 when no value is supplied.
To allow the parameter to be changed on the schematic page, treat G as property in the template.
The template is:
X^@REFDES %a %b Z PARAMS: ?G|G=@G|
~G|G=1000|
An equivalent template (using the if...else form) is:
X^@REFDES %a %b Z PARAMS: ?G|G=@G||G=1000|
A sample translation of the template is:
X_U33 101 102 Z PARAMS: G=1024
where REFDES equals U33, G is set to 1024, and the subcircuit connects to nets 101 and 102.
Another sample translation of the template is:
X_U33 101 102 Z PARAMS: G=1000
where the settings of the previous translation apply except that G is undefined.
Digital stimulus parts with variable width pins template
For a digital stimulus device template (such as that for a DIGSTIM part), a pin name can be preceded by an asterisk (*) character. This signifies that the pin can be connected to a bus and the width of the pin is set to be equal to the width of the bus.
The template is:
U^@REFDES STIM(%#PIN, 0) %*PIN
\n+ STIMULUS=@STIMULUS
where #PIN refers to a variable width pin.
A sample translation of the template is:
U_U1 STIM(4,0) 5PIN1 %PIN2 %PIN3 %PIN4
+ STIMULUS=mystim
where the stimulus is connected to a four-input bus, a[0-3].
Pin callout in subcircuit templates
The number and sequence of pins named in a template for a subcircuit must agree with the definition of the subcircuit itself--that is, the node names listed in the .SUBCKT statement, which heads the definition of a subcircuit. These are the pinouts of the subcircuit.
IO_LEVEL property
The IO_LEVEL property defines the level of interface subcircuit model PSpice must use for a digital part that is connected to an analog part.
If you are creating a digital part, you need to
-
Add the IO_LEVEL property to the part and assign a value shown in the table below.
Value Interface subcircuit (level) 0 circuit-wide default 1 AtoD1 and DtoA1 2 AtoD2 and DtoA2 3 AtoD3 and DtoA3 4 AtoD4 and DtoA4 - Use this property in the property definition (IO_LEVEL is also a subcircuit parameter used in calls for digital subcircuits).
MNTYMXDLY property
The MNTYMXDLY property defines the digital propagation delay level that PSpice must use for a digital part.
If you are creating a digital part, you need to do the following
-
Add the MNTYMXDLY property to the part and assign a value shown in the table below.
Value Propagation delay 0 circuit-wide default 1 minimum 2 typical 3 maximum 4 worst-case (min/max) - Use this property in the property definition (MNTYMXDLY is also a subcircuit parameter used in calls for digital subcircuits).
PSPICEDEFAULTNET property
The PSPICEDEFAULTNET pin property defines the net name to which a power or ground (invisible) pin is connected.
For example, if the power and ground pins on a digital part are connected to the digital nets $G_DPWR and $G_DGND, respectively, then the properties are defined as follows:
PSPICEDEFAULTNET=$G_DPWR
PSPICEDEFAULTNET=$G_DGND
If you are creating a digital part, you need to do the following
- For each power pin, create a PSPICEDEFAULTNET property and assign the name of the digital net to which the pin is connected.
- Use the appropriate pin name in the property definition.
Guidelines and Best Practices for Specifying Values for Part Properties
Note the following when specifying values for part properties:
- Do not leave a space between the value and its unit, if the unit is a scale symbol. For example, specify 5K instead of 5 K.
- Specify tolerance values as percentages. If you specify an absolute value, the tolerance value will be read as an absolute number. For example, if you specify the value of the POSTOL property as a percentage, say 10%, on a 10K resistor, the distribution values will be taken in the range of 10K?1K. If you specify the tolerance value as an absolute number, say 10, the distribution values will be taken in the range of 10K?10?
Placing PSpice Ground 0 Symbols for PSpice Simulations
For PSpice analog simulation to run, your design must have a PSpice ground (0) symbol. The CAPSYM.OLB, which is the default library in Capture, includes the PSpice ground (0) symbol. Use the 0 symbol to place a PSpice ground 0 symbol in your design.
To select the 0 symbol:
- Choose Place – Ground (or use the Place Ground toolbar button). The Place Ground dialog box appears.
-
Select the CAPSYM part library from the Libraries list (if it is not already selected).
You can also place the 0 symbol from the Source part library. To do this, add the Source part library to the Libraries list using the Add Library button; SOURCE.OLB is located in the \TOOLS\CAPTURE\LIBRARY\PSPICE subdirectory under your installation directory.
- Select the 0 symbol (if not already selected).
-
Click OK to place the PSpice ground 0 symbol.
Alternatively:
- You can place any ground symbol, open the Property Editor, and change its name to 0.
- You can place PSpice ground 0 symbol from PSpice Component quick pick, that is, Place - PSpice Component - PSpice Ground.
While generating the PSpice netlist, if Capture does not find a PSpice ground (0) symbol in your design, then a warning message is flagged in the Session Log. You may ignore the warning, if the design will be used for running the digital PSpice simulation. However, for running analog simulation, the design must have at least one PSpice ground 0 symbol.
If you are starting a new analog PSpice design, then it is recommended that you use the PSpice project template, AnalogGNDSymbol.opj. This project by default has the PSpice ground 0 symbol needed for your analog designs.
Using the FLOAT Property for Unconnected Pins
When preparing a circuit for simulation with PSpice, it is important that all pins for all parts are connected properly. If a pin is meant to remain unconnected intentionally, you need to use the PSpice pin property FLOAT, rather than a No Connect symbol. Otherwise, the circuit may not netlist correctly for PSpice.
The pin property FLOAT may have one of the following three values:
Value | Description |
---|---|
Error | The pin will not netlist. An error message will be returned when the PSpice simulation netlist is generated. Use Error when you want to be reminded that this pin is a "no connect" and should be treated in a special way. Error is the default value. |
RtoGND | The pin is connected to a virtual resistor, whose opposite pin is tied to GND. The resistor has a value of 1/GMIN. This value allows the simulation netlist to be created and allows PSpice to perform the analysis. The virtual resistor will not be processed as part of a layout netlist or appear in a BOM. |
UniqueNet | The pin, when left unconnected, is attached to a unique node when the PSpice simulation netlist is generated. Use UniqueNet when you want the pin to remain unconnected but correspond to the Probe data associated with its part. |
The FLOAT property can either be defined in the part editor when creating a new part, or you can edit a pin on an existing part using the property editor.
To define the FLOAT property using the property editor
- In Capture, double-click on the pin to open the property editor spreadsheet.
- Click on the Pins tab.
- Click New Property and type FLOAT (upper case) in the Name text box.
- Type the property value you want to use, then click OK.
- Click Apply or close the spreadsheet to have the changes take effect.
Using Global Parameters and Expressions
In addition to literal values, you can use global parameters and expressions to represent numeric values in your circuit design.
Global parameters
A global parameter is like a programming variable that represents a numeric value by name.
Once you have defined a parameter (declared its name and given it a value), you can use it to represent circuit values anywhere in the schematic; this applies to any hierarchical level.
Some ways that you can use parameters are as follows:
- Apply the same value to multiple part instances.
- Set up an analysis that sweeps a variable through a range of values (for example, the DC sweep or parametric analysis).
When multiple parts are set to the same value, global parameters provide a convenient way to change all their values for "what-if" analyses.
For example, if two independent sources have a value defined by the parameter VSUPPLY, then you can change both sources to 10 volts by assigning the value once to VSUPPLY.
Declaring and using a global parameter
To use a global parameter in your design, you need to:
- define the parameter using a PARAM part from SPECIAL.OLB.
- use the parameter in place of a literal value somewhere in your design.
To declare a global parameter
- Place a PARAM part in your design.
- Double-click the PARAM part to display the Parts spreadsheet.
- Do the following for each global parameter:
- Click New, then enter NAMEn in the Property Name field, then click OK. This creates a new property for the PARAM part, NAMEn in the spreadsheet.
- Click on the cell below the NAMEn column and enter a default value for the parameter.
-
While this cell is still selected, click Display. In the Display format frame, select Name and Value, then click OK.
System variables have reserved parameter names. Do not use these parameter names when defining your own parameters.
- Click Apply to update all the changes to the PARAM part, and then close the spreadsheet.
For example, to declare the global parameter VSUPPLY that will set the value of an independent voltage source to 14 volts, place the PARAM part, and then create a new property named VSUPPLY with a value of 14V.
To use the global parameter in your circuit
- Find the numeric value that you want to replace: a component, model parameter, or other property value.
-
Replace the value with the name of the global parameter using the following syntax:
{ global_parameter_name }
The curly braces tell PSpice to evaluate the parameter and use its value.To avoid errors, always include parameter variable name in curly braces when it is assigned to the parameter/property on the part.
Expressions
PSpice evaluates the expression to a single value every time:
- it reads in a new circuit
- a parameter value used within an expression changes during an analysis.
An example of this would be a parameter that changes with each step of a DC sweep or parametric analysis.
Specifying expressions
To use an expression in your circuit
- Find the numeric or boolean value you want to replace: a component value, model parameter value, other property value, or logic in an IF function test.
- Replace the value with an expression using the following syntax:
{ expression }
where {expression} can contain any of the following:
- standard operators (listed in the table below)
- built-in functions (listed in the PSpice User's Guide)
- user-defined functions
- system variables (listed in the PSpice User's Guide)
- user-defined global parameters
- literal operands
The curly braces tell PSpice to evaluate the expression and use its value.
Operator class | Operator | Operation |
---|---|---|
arithmetic | ||
+ | addition or string concatenation | |
- | subtraction | |
* | multiplication | |
/ | division | |
** | exponentiation | |
logical | ||
~ | unary NOT | |
| | boolean OR | |
^ | boolean XOR | |
& | boolean AND | |
relational* | ||
== | equality test | |
!= | non-equality test | |
> | greater than test | |
>= | greater than or equal to test | |
< | less than test | |
<= | less than or equal to test |
*Logical and relational operators are used within the IF() function; for digital parts, logical operators are used in Boolean expressions.
Defining Stimuli
To simulate your circuit, you need to connect one or more source parts that describe the input signal that the circuit must respond to .
The PSpice libraries supply several source parts that are described in the tables that follow. These parts depend on:
- the kind of analysis you are running,
- whether you are connecting to the analog or digital portion of your circuit, and
- how you want to define the stimulus: using a file specification, or by defining part property values.
Analog stimuli
Analog stimuli include both voltage and current sources. The following table shows the part names for voltage sources.
Input | Part for voltage |
---|---|
DC bias | VDC or VSRC |
AC magnitude and phase | VAC or VSRC |
exponential | VEXP |
periodic pulse | VPULSE |
piecewise-linear | VPWL |
piecewise-linear that repeats forever | VPWL_RE_FOREVER or VPWL_F_RE_FOREVER |
piecewise-linear that repeats n times | VPWL_N_TIMES or VPWL_F_N_TIMES* |
frequency-modulated sine wave | VSFFM |
sine wave | VSIN |
*VPWL_F_RE_FOREVER and VPWL_F_N_TIMES are file-based parts; the stimulus specification is saved in a file and adheres to the PSpice netlist syntax.
To determine the part name for an equivalent current source, in the table of voltage source parts, replace the first V in the part name with I. For example, the current source equivalent to VDC is IDC, to VAC is IAC, to VEXP is IEXP, and so on.
If you want to specify multiple stimulus types
If you want to run more than one analysis type, including a transient analysis, then you need to use either of the following:
- time-based stimulus parts with AC and DC properties
- VSRC or ISRC parts
Using time-based stimulus parts with AC and DC properties
The time-based stimulus parts that you can use to define a transient, DC, and/or AC input signal are listed below.
VEXP | IEXP |
VPULSE | IPULSE |
VPWL | IPWL |
VPWL_F_RE_FOREVER | IPWL_F_RE_FOREVER |
VPWL_F_N_TIMES | IPWL_F_N_TIMES |
VPWL_RE_FOREVER | IPWL_RE_FOREVER |
VPWL_RE_N_TIMES | IPWL_RE_N_TIMES |
VSFFM | ISFFM |
VSIN | ISIN |
In addition to the transient properties, each of these parts also has a DC and AC property. When you use one of these parts, you must define all of the transient properties. However, it is common to leave DC and/or AC undefined (blank). When you give them a value, the syntax you need to use is as follows.
Property | Syntax |
---|---|
DC | DC_value[units] |
AC | magnitude_value[units] [phase_value] |
For the meaning of transient source properties, refer to the I/V (independent current and voltage source) device type syntax in the Analog Devices chapter in the online PSpice Reference Guide.
Using VSRC or ISRC parts
The VSRC and ISRC parts have one property for each analysis type: DC, AC, and TRAN. You can set any or all of them using PSpice netlist syntax. When you give them a value, the syntax you need to use is as follows.
Property | Syntax |
---|---|
DC | DC_value[units] |
AC | magnitude_value[units] [phase_value] |
TRAN | time-based_type (parameters) |
where time-based_type is EXP, PULSE, PWL, SFFM, or SIN, and the parameters depend on the time-based_type.
Digital stimuli
Input | Part |
---|---|
For transient analyses | |
DIGSTIMn | signal or bus (any width) |
DIGCLOCK | clock signal |
STIM1 | 1-bit signal |
STIM4 | 4-bit bus |
STIM8 | 8-bit bus |
STIM16 | 16-bit bus |
FILESTIMn | file-based signal or bus (any width) |