view ueda/doc/netlisting.txt @ 139:bf188727e606

donl-rename-parts reader: no tEDAx-style escapes
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 07 Sep 2020 04:25:11 +0000
parents cd92449fdb51
children
line wrap: on
line source

How uEDA tracks electrical interconnect (netlist) information

Whereas the MCL (see mcldoc.txt) is the authoritative source of information
about all components making up a board design, information about the way they
are interconnected is stored in the schematic sheets (.usch files) in the
language described in uschemlang.txt.  Electrical connections are declared by
way of assigning component pins to named or unnamed nets and may or may not be
represented graphically.  The following two constructs in the uschem language
connect component pins to nets:

* Net and GraphNet objects
* PinToNet decorations on component instance objects

Whichever method is used (see uschemlang.txt for the syntax details), the
declaration of an electrical connection effectively consists of the following
3 parts:

* Identification of the component involved;
* Identification of which pin to connect;
* The name of the net. (Net and GraphNet objects can create unnamed nets -
  those connect together everything listed in the respective object, but
  nothing else can connect to such nets.)

While it's possible for the component identification to be equal to the refdes
as given in the MCL and for the pin identification to be the "raw" pin number,
uEDA provides two mechanisms that allow the interconnect information to be
entered in a slightly more high-level form: component instances and pinout
mapping.

Component instances

In uEDA a component instance is essentially a reference from a schematic sheet
to a component in the MCL.  In a graphical schematic each component instance
would normally be represented by a graphical symbol, and all net connections
made in schematic sheets actually refer to component instances rather than to
MCL components directly.

For trivial components like resistors and capacitors as well as some simple
ICs there is normally only one instance per component, hence the component in
the MCL and the instance in a .usch sheet are one and the same for all practical
purposes.  However, for many of the more complex components it is generally
desirable to break the component up into multiple sections (which may be
identical or heterogeneous) represented separately in the schematic source code
for the design.  That's what the component instances in uEDA are for.

In the case when there are multiple component instances referring to the same
component, these instances may appear either in the same schematic sheet or in
different sheets.  If a given schematic sheet contains only one instance of a
given MCL component, regardless of whether or not there are other instances for
the same component in other sheets, the instance name may be equal to the refdes
of the component - that's what happens when the user doesn't make use of the
component instance mechanism.  However, if a single schematic sheet contains
more than one instance for a given component, there needs to be a way to
distinguish between them.

When uEDA tools process a uschem sheet and match it to the MCL, the following
algorithm is used to match component instances to components:

1. All component instance names appearing in a given schematic sheet are
   required to be unique.
2. Each component instance name is stripped of any trailing lowercase letters to
   obtain the corresponding refdes.
3. Each refdes is looked up in the MCL - if not found, that is an error.

Thus if you need to put multiple instances for a given component in a single
schematic sheet, give each a unique name consisting of the refdes with a unique
all-lowercase suffix appended to it.

Pinout mapping

uEDA allows one to use two different alphanumeric strings to identify the
individual pins of a component: pin name and pin number.  Both are arbitrary
alphanumeric strings (actually strings of any printable ASCII characters subject
only to common sense limitations); the pin number string doesn't have to be
purely numeric.  (For example, PGA and BGA packages normally use alphanumeric
pin numbers.)

Pin numbers are what appears in the final netlist output from uschem-netlist(1),
and they may also be used in the schematic source code.  If the source only uses
pin numbers for a given component, then there is no need for uEDA to know the
pinout of that component.  However, uEDA also allows one to specify the pinout
mapping for a component and to use pin names instead of pin numbers.

Pinouts are specified in dedicated pinout mapping files and brought into the
design via pinout= attributes in the MCL.  Pinout mapping files use a very
straightforward format: each pin mapping is given on a separate line; each such
line consists of two fields separated by tabs or spaces: the left field is the
pin name and the right field is the pin number.  Comments are marked by '#';
all blank lines and comment lines are ignored.  Any additional fields past the
pin number are currently ignored as well, but this behavior should not be relied
upon; any such line-appended comments should begin with a '#' character.

The name of the pinout mapping file specified in the pinout= attribute is only
the base filename, not a pathname.  uschem-netlist and uschem-print (the only
two programs in the uEDA suite that need pinout mappings) locate pinout mapping
files using the same mechanism that is used to locate graphical symbol files -
see uschem-netlist(1) and uschem-print(1).

In addition to making the schematic source code more readable, pinout mappings
make it easy to support components that come in several different packages with
different physical pin numbers for the same logical functions.  It is no longer
necessary to create multiple versions of the same graphical symbols with
different pin numbers embedded inside or to edit pin references in Net objects;
instead all those references can now be made by the logical pin name.  If a
decision is made to change to a different package with a different pinout, only
the pinout= attribute in the MCL entry for the respective component needs to be
changed - at the same time when you change the manufacturer_part_number= and
footprint= attributes.

By the same token it is no longer necessary to create special PCB footprints
with logical pin names embedded in them where pin number strings normally go:
instead one can take the natural approach of having footprints identify pins or
pads by their physical position, having schematics and symbols refer to pins by
their logical function only and using pinout mapping files to bridge the gap.
The pinout mapping feature is one of uEDA's main advantages over gEDA.

Slotting

The concept of slotting (and the term) originates in gEDA, but uEDA implements
it in a very different manner.  uEDA's approach to slotting combines component
instances with pinout mapping in a special way.  But first, what is slotting?

Suppose that you have a physical component (typically an IC) that consists of
multiple identical logical blocks such that each of those blocks should be
treated as a separate device in the schematic source code.  74xx logic ICs are
a classic example.  When one needs to describe the use of such a component in a
design, it is normally desirable to represent each slot as its own component
instance and furthermore to do it in such a way that one doesn't have to decide
upfront which slot will be used for what, allowing slots to be reassigned with
ease.

In uEDA this feat is accomplished by combining component instances with pinout
mapping.  When each slot is declared as a component instance, all connections
to it are made by logical names only: for example, a NAND gate that is 1/4th of
a 7400 would have connections made to A, B and Y rather than to specific pin
numbers.  So far, so good.  But how would the tools know whether A for example
should be mapped to pin 1, 4, 9 or 12?  That is where the slot= attribute comes
in.  It is one of the few attributes defined in the component instance
declaration (Component object) in a schematic sheet rather than in the MCL.
When uEDA tools map a pin name to a pin number for a component instance that has
the slot= attribute defined, the value of this attribute is appended to the pin
name after a colon, e.g., if the pin name is A and slot=1, the pin name looked
up in the pinout mapping table will be A:1.  The pinout for a 7400 quad NAND
gate looks like this:

#pin name	pin number
A:1		1
B:1		2
Y:1		3
A:2		4
B:2		5
Y:2		6
GND		7
Y:3		8
A:3		9
B:3		10
Y:4		11
A:4		12
B:4		13
Vcc		14

Note the GND and Vcc pins which are not slotted.  It is perfectly legitimate to
have some component instances which have the slot= attribute selecting one of
the logic slots, yet have other component instances referring to the same
component (e.g., for the power pins) without slotting.

The following pinout for an SN75LBC784 EIA-423 transceiver is a more complicated
example of heterogeneous slotting:

#pin name	pin number
Drvr_In:3	1
Rcvr_Out:3	2
BIAS1		3
Drvr_In:4	4
Rcvr_Out:4	5
BIAS2		6
Vss		7
GND		8
Rcvr_In_N:4	9
Drvr_Out:4	10
Rcvr_In_N:3	11
Drvr_Out:3	12
Rcvr_In_P:3	13
Rcvr_In_P:4	14
Rcvr_In_P:1	15
Rcvr_In_P:2	16
Rcvr_In_N:2	17
Drvr_Out:2	18
Rcvr_In_N:1	19
Drvr_Out:1	20
Vdd		21
Rws		22
Drvr_In:1	23
Rcvr_Out:1	24
BIAS3		25
Drvr_In:2	26
Rcvr_Out:2	27
BIAS4		28

This IC has 4 driver sections, 4 receiver sections and a set of common pins.
The pinout file given above allows it to be represented schematically using a
separate component instance for each driver section (with slotting), a separate
set of component instances for the receiver sections (an independent set of
slots) and one or more non-slotted component instances for the common pins.

It is also worth noting that slot names (the value of the slot= attribute) are
not restricted to numbers only and may in fact be arbitrary ASCII strings.  For
example, it would be sensible to define the pinout for a bicolor LED with slots
named "red" and "green", having complete pin names such as A:green and C:red
with connections being made to just A and C on the proper instances.

Netlist generation

When uschem-netlist processes a set of schematic sheets and an MCL to compile a
complete netlist, it first resolves all pin names (with or without slots) to
physical pin numbers and tracks the connection information at the component
level, i.e., the information is effectively moved up from the instance level at
which it is specified in the schematic source code to the component level.  The
netlist data structures constructed by uschem-netlist maintain a hard
requirement that every physical pin of every component listed in the MCL be
either connected to exactly one net or left unconnected; thus any attempt to
connect the same physical pin to more than one net will be detected and flagged
as an error regardless of how each connection was specified in the source code.

One may use the NoConnect decoration on a component instance object to declare
explicitly that a given pin shall be left unconnected.  uschem-netlist will note
such declarations and flag an error if an attempt is made anywhere else in the
source code to connect the same physical pin to some net.

Differences from gEDA

The main difference between gEDA and uEDA with regard to netlisting is that in
uEDA graphical elements such as symbols and net lines do not create electrical
connections, they merely illustrate them.  The uschem language (documented fully
in uschemlang.txt) is designed so that the graphical information and the
electrical interconnect information are mostly orthogonal.  The electrical
interconnect information must be fully specified in the .usch files, not
inferred from symbol files, to the point that the latter files are not needed
for netlist generation and are not read by uschem-netlist at all.  Thus gEDA
constructs such as auto-connected hidden power pins have no place in uEDA; the
closest one can get to that would be to insert a non-graphical component
instance with the necessary net connections into an otherwise graphical
schematic sheet.

By a similar token the graphical symbols for power rails and such do not cause
a net to be connected to a rail, instead that connection is made by having the
proper netname set on the GraphNet object in the .usch file; the symbols merely
illustrate it graphically for those looking at the printout rather than the
source code.

The downside with uEDA's approach is of course the very real possibility that
the netlist and the graphics will get out of sync, i.e., that the set of
electrical interconnections mentally inferred by someone looking at the
graphical schematic printout will differ from the set of interconnections
embodied in the source code processed by uEDA tools.  See drc.txt for the
discussion of how uEDA addresses this problem.