view ueda/doc/mcldoc.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

uEDA Master Component List (MCL) description

The MCL is an essential component of the design source code in the uEDA flow.
It is a human-created and human-edited text file which lists all components on
the board being designed and all their attributes.  The file must be named
"MCL" (w/o quotes) and must reside in the project directory.  This document
describes the file format and everything you need to know in order to write the
MCL for your board.

Each component on the board must have a reference designator (refdes).  Valid
characters for the refdes are uppercase and lowercase letters and digits; the
first character must be an uppercase letter.  Lowercase letters are allowed but
not recommended, in particular a refdes should not end in any lowercase letters
- see the description of component instances in netlisting.txt for the
explanation.

The MCL contains a section for each component of the form:

refdes:
 attribute=value
 attribute=value
 ...

Each refdes line must begin in the leftmost column without leading spaces
and end with a colon.  It is followed by attribute lines defining various
attributes for the component in question; these attributes are the essence of
the information contained in the MCL.  Different attributes are required by
different tools in the uEDA suite and all currently defined attributes are
listed in this document.  Attributes are name=value pairs and attribute lines
in the MCL must begin with a tab or space.  Both the name and the value must
be present and non-null.  For most attributes it is meaningless and illegal to
have multiple attributes with the same name for the same component, but there
are a few attributes which can be given more than once for a given component.
Attribute values may contain spaces.

Blank lines are ignored and non-processed comments may appear anywhere in the
file introduced by a '#' character.  Everything between a '#' character and
the following newline is ignored.

Here is an example component definition that can appear in the MCL:

J1:
 device=DB25F
 footprint=DB25F
 description=Connector, DB25F, right angle
 manufacturer=AMP
 manufacturer_part_number=747846-4

If it is desired to define multiple components with the same attributes, the
following shorthand syntax may be used:

C43,C44,C45,C46,C47,C48,C49:
 # Voltage reference capacitors for RS8973
 # schematic page 6
 value=0.22 uF
 footprint=0805
 description=Ceramic chip capacitor, X7R, 0.22 uF, 0805
 manufacturer=Panasonic
 manufacturer_part_number=ECJ-2VB1C224K
 vendor=Digi-Key
 vendor_part_number=PCC1816CT-ND
 bom_comment=RoHS part, no SnPb version available

uEDA tools generally process components in the order in which they are defined
in the MCL, thus you should list your components in the MCL in the order in
which you would like them to appear on the BOMs generated from it.  In
particular, there is no collating function for the refdes string, so if you have
a collating order in mind for your reference designators, implement it in the
order in which you list them in the MCL.

Currently defined attributes

bom_comment=

	This attribute specifies a free-form line of text to be included in the
	procurement BOM (generated by ueda-mkbom) for this part.  This attribute
	may be given more than once in order to include multiple comment lines.
	This attribute should be used to include information in the BOM that is
	not covered by any other defined attributes.

bom_part_title=

	This attribute specifies the title line for this part in the procurement
	BOM.  Normally the title line is constructed from the manufacturer= and
	manufacturer_part_number= attributes, but this attribute overrides it.

description=

	This attribute gives a one line summary description of the component for
	BOMs.  What information should be included is subjective, but one
	starting point is that uEDA-generated BOMs include the information from
	the manufacturer= and manufacturer_part_number= attributes, but not from
	other attributes like value= or footprint=.  Thus if the value and
	footprint information is desired, it should be included in the
	description, but don't include the manufacturer or the part #.

device=

	If the component has an associated alphanumeric designation that is
	universally recognized and meaningful to someone looking at your design
	at the high level (i.e., without getting down to part numbers), it
	should be given as the device= attribute.  Examples:

	device=74LS04
	device=29F010
	device=41256

	A good general rule of thumb is that if it isn't obvious what to put in
	the device= attribute, you probably shouldn't have this attribute at all
	for the component rather than make something up.  In particular, basic
	semiconductors (diodes and transistors) and passives do not use this
	attribute.

	The device= attribute is not currently used very much by uEDA tools,
	but it sometimes provides a fallback for the manufacturer_part_number=
	attribute if the latter isn't given.

footprint=

	This attribute facilitates the pre-layout step of the uEDA flow.
	See prelayout.txt for the details.

	A value of "none" indicates that the component has no footprint on the
	PCB.  I admit that the physical meaning of such a specification is a
	little unclear, but ueda-getfps will skip such components without error
	or warning messages.

	A value of "TBD" (to be determined) means that you realise you need a
	footprint, but aren't able to name it yet.  ueda-getfps recognizes this
	special value and issues an appopriate warning, but doesn't try to look
	for an actual footprint named "TBD".

manufacturer=

	Should be self-explanatory.

manufacturer_part_number=

	Should be self-explanatory.  Meaningless without manufacturer= also
	being specified.

npins=

	In the uEDA model pin numbers are arbitrary alphanumeric strings in the
	general case, allowing for mixed alphanumeric pin "numbers" used on PGA
	and BGA packages.  However, most components have simple numeric pin
	numbers ranging from 1 to some N inclusive.  If your component falls
	into the latter category, you should define an npins=N attribute.
	Having this definition makes uschem-netlist(1) run much more
	efficiently, detect invalid pin numbers and produce naturally sorted
	pin lists.

part=

	See the Components vs. parts section below.

pcbvalue=

	The PCB layout file format includes 3 ASCII strings for each element:
	"description" (not really used, uEDA puts the footprint name there),
	"name on the PCB" (refdes) and "value".

	The pcbvalue= attribute explicitly sets the "value" parameter in the
	PCB elements generated by the ueda-getfps | ueda-runm4 pipeline (see
	prelayout.txt).  If the pcbvalue= attribute is not defined, ueda-getfps
	tries value=, device= and manufacturer_part_number= in this order.  If
	none of these attributes are given, a null string is used.

pinout=

	This attribute specifies the name of the pinout mapping file to be used
	for this component.  See the Pinout mapping section in netlisting.txt
	for the explanation.

population_option=

	See Population options in bom_model.txt.

	The value of this attribute is either a decimal integer identifying the
	population group this component belongs to or the keyword "NO".

	population_option=NO indicates that the component is never populated at
	all in any of the standard population options, e.g., a component that
	is only populated for debug purposes.  Such components appear in the BOM
	only if -pall is given to ueda-mkbom(1) or ueda-shortbom(1).

socket=

	If the component is to be socketed, this attribute specifies the part ID
	for the socket.  See the Components vs. parts section below for the
	explanation of the part ID.

source=

	This attribute indicates a source for the procurement of this part.
	It may be given more than once to indicate multiple sources where parts
	can be obtained.

	If one or more source= attributes are given, the vendor= and
	vendor_part_number= attributes are not used.

substitute=

	This attribute lists an "acceptable substitute" for the part specified
	by the manufacturer= and manufacturer_part_number= attributes.  This
	attribute may be given more than once.

	Given the unfortunate reality of part availability, it is often the
	case that the manufacturer= and manufacturer_part_number= attributes
	specify the ideal wish list part (e.g., one with SnPb solder coating)
	while substitute= attributes list what's actually obtainable (e.g., the
	lead-free crap).

value=

	This attribute is intended to hold the value of components such as
	resistors and capacitors for which a numeric value is meaningful.  uEDA
	does not currently make any formal use of this attribute, hence there
	are no formal rules currently as to units, exact syntax etc.

vendor=

	Should be self-explanatory.  Specifies the name of a vendor from whom
	the part may be obtained.

vendor_part_number=

	Should be self-explanatory.  Meaningless without vendor= also being
	specified.

	Unlike source=, the vendor= and vendor_part_number= attributes may not
	be given more than once.  If multiple sources need to be listed, the
	source= attribute must be used instead.  Neither vendor= nor
	vendor_part_number= is used if any source= attributes are present.

Components vs. parts

Contrast the following alternative descriptions of the same component:

* A 0.1 uF capacitor
* Ceramic chip capacitor, X7R, 0.1 uF, 0805
* Panasonic ECJ-2VB1C104K

The first description is what you would likely use in the initial design of your
circuit, the second description may appear on the list of required components
when your design is finished, and a description of the third kind can be made
about the components found on the final board when it's fully assembled.

The uEDA MCL makes a distinction between components and parts.  A component is
something that has a refdes and an associated section in the MCL; a part is
something that can appear on a procurement BOM with a quantity next to it.
uEDA also has a process of "reducing components to parts", which basically
means going from a description of the first kind above to one of the 2nd or 3rd
kind.

Given that you are free to specify or not specify each of the defined attributes
for each component in the MCL, your initial design may be as vague or as
specific as you like.  For example, you may put a capacitor on your schematic
and list it in the MCL, but not specify anything else.  Or you may specify the
value while leaving the footprint undecided.  Or vice-versa.  Or you could
specify both the value and the desired footprint, but put no more thought as
to what kind of actual capacitor you would need.

However, when it's time to actually build your board, you will have to pick
some specific part from the Digi-Key catalog (or substitute your favourite
component supplier), order it and populate it on the board.  That will be a
specific part with a very concrete set of parametric specifications.  This is
what I mean by reducing components to parts.

The concepts just described may be self-evident, but the reason I'm spelling
them out is that uEDA has some special support for reducing components to parts.
Namely, the MCL syntax that has been described so far is not actually the whole
story.  If the syntax described so far was all that's available, the process of
reducing components to parts would be very clumsy.  For example, if you had
decided that your 0.1 uF bypass caps would be 0805s and that you would order
and populate Panasonic ECJ-2VB1C104K parts for them, you would have to enter
the full information about this part for every component (every refdes) in the
MCL where you had a 0.1 uF bypass capacitor.  This approach would suffer from
two problems:

* The replication of information would be very redundant and error-prone.

* The process for generating the procurement BOM would face the problem of
  how to tally all of those separately described components into a quantity of
  one part.

The uEDA solution is that in addition to components with reference designators,
the MCL file format allows for part definitions.  A part definition has the
following form:

part part-ID:
 attribute=value
 attribute=value
 ...

The part-ID is an arbitrary ASCII label for your part.  Component definitions
can then refer to your part definition by its part-ID using this syntax:

refdes:
 part=part-ID

Example:

part bypasscap-0.1uF-0805:
 value=0.1 uF
 footprint=0805
 description=Ceramic chip capacitor, X7R, 0.1 uF, 0805
 manufacturer=Panasonic
 manufacturer_part_number=ECJ-2VB1C104K
 vendor=Digi-Key
 vendor_part_number=PCC1812CT-ND
 bom_comment=RoHS part, no SnPb version available

C1:
 # Bypass cap for U5
 part=bypasscap-0.1uF-0805

Most tools in the uEDA suite treat such part references as nothing more than
shorthand, in other words, the example above would be equivalent to:

C1:
 value=0.1 uF
 footprint=0805
 description=Ceramic chip capacitor, X7R, 0.1 uF, 0805
 manufacturer=Panasonic
 manufacturer_part_number=ECJ-2VB1C104K
 vendor=Digi-Key
 vendor_part_number=PCC1812CT-ND
 bom_comment=RoHS part, no SnPb version available

The one important exception is ueda-mkbom.  For the procurement-oriented BOM
parts are essential, and ueda-mkbom operates only on parts, not on components.
When it reads the example above, it takes note of part bypasscap-0.1uF-0805,
counts all components that refer to it and emits it in the BOM with the counted
quantity.

What does ueda-mkbom do when it encounters a component that has no part=
attribute?  It may be either a component that hasn't been reduced to a part yet
(in which case ueda-mkbom can't do anything with it other than issue a warning
message), or a component that self-defines its part.  A component is considered
to self-define a part if it has both manufacturer= and manufacturer_part_number=
attributes or a bom_part_title= attribute.  Alternatively, a component may be
explicitly declared to self-define its part with a part=yes attribute (see
below).

Every part definition (explicit or implicit in a component that self-defines
its part) that is to be usable to ueda-mkbom must have some attributes from
which ueda-mkbom can make a title for it in the BOM.  ueda-mkbom considers part
attributes in this order:

* bom_part_title= if one is given
* manufacturer= and manufacturer_part_number= if both are given
* manufacturer= and device= if both are given
* description= if one is given

If none of the above attributes are present for a part which needs to go into
the BOM, it is an error.

Formal definition of the part= attribute

The part= attribute may appear only in component definitions and not in part
definitions.  The value of the part= attribute may be one of the following:

* The keyword "none". This specification indicates that the component has no
  associated part and that this lack of a part is not an error. Note that it's
  possible to have a component which has no part but still has a footprint.
  An example would be a test point or an antenna made from the copper etch on
  the PCB.

* The keyword "yes". This specification indicates that this component
  self-defines its part, i.e., that the MCL section being parsed is both a
  component definition and a part definition.

* A part-ID defined by a part definition earlier in the MCL file.

* A refdes of another component which appears earlier in the MCL file and self-
  defines its part.

Note that no forward references are allowed.

Component definitions which refer to a part definition may override some of the
attributes in the latter, as long as such an override is physically meaningful.
(Overriding the value of a Panasonic ECJ-2VB1C104K cap to something other than
0.1 uF is not.)  The population_option= attribute is normally set at the
component level rather than the part level, but other attributes may also be
overridden sometimes.  For example, a dual position resistor (DPR) may be made
by taking a standard SMT resistor part (which would contain a footprint=
attribute for its normal two-pad footprint) and overriding its footprint to
a DPR footprint with 3 pads.

Socket parts

If a component is to be socketed, the socket part should have its own part
definition with a part-ID assigned and should be referenced via the socket=
attribute.