PipalConnect.mesa 
Copyright Ó 1988 by Xerox Corporation. All rights reversed.
Created by Bertrand Serlet March 18, 1988 5:38:22 pm PST
Bertrand Serlet April 14, 1988 10:29:55 pm PDT
DIRECTORY
Pipal, PipalInt, PipalMos;
PipalConnect: CEDAR DEFINITIONS = BEGIN
Theory
This interface defines how to intersect rectangles in order to obtain Connectors. We call this operation connectizing.
Connector Type
Each Object can connectize into a null connector (e.g. text in layout), a leaf connector (e.g a contact or a transistor, in which only the interface is known) or a composite connector (e.g. an overlay). In the leaf and composite cases, it is possible to enumerate the ports, stars or names of the object. When the object is a composite connector, it is also possible to reach inside it.
Type: TYPE = {null, leaf, composite};
GetTypeProc: TYPE = PROC [object: Pipal.Object, mode: Mode] RETURNS [type: Type];
GetType: GetTypeProc;
Applies the getType method, EnumerationType by default.
EnumerationType: GetTypeProc;
Applies PipalInt.Enumerate and returns null if there was no child, null or leaf if there was a single null or leaf child, composite otherwise.
NullType: GetTypeProc;
Always returns null.
LeafType: GetTypeProc;
Always returns leaf.
CompositeType: GetTypeProc;
Always returns composite.
Ports Enumeration
EachPortProc: TYPE = PROC [transformation: PipalInt.Transformation, portIndex: NAT, port: Pipal.Object] RETURNS [quit: BOOLFALSE];
First portIndex is 0
EnumeratePortsProc: TYPE = PROC [object: Pipal.Object, mode: Mode, privateArea: PipalInt.Rectangle, eachPort: EachPortProc, transformation: PipalInt.Transformation ← []] RETURNS [quit: BOOLFALSE];
Can only be called if GetType[object, mode] is leaf or composite.
privateArea is the area in which nodes are not promoted. It is used only for composite connectors.
EnumeratePorts: EnumeratePortsProc;
Applies the enumeratePortsMethod method, EnumerationEnumeratePorts by default.
Two invocations with same object, mode and privateArea applies eachPort with the same arguments, in the same order.
CountPorts: PROC [object: Pipal.Object, mode: Mode, privateArea: PipalInt.Rectangle] RETURNS [count: NAT ← 0];
Returns the number of ports.
EnumerationEnumeratePorts: EnumeratePortsProc;
Applies PipalInt.ObjectEnumerate, assuming there is a single child, and applies children enumeration.
ComposerEnumeratePorts: EnumeratePortsProc;
Enumerate the ports of a the composite connector obtained by GetComposer (see below).
AtomicEnumeratePorts: EnumeratePortsProc;
Used for primitive objects which extract as one electric component.
WellAtomicEnumeratePorts: EnumeratePortsProc;
Used for primitive objects which extract as one or two electric components.
Composite Connector
Composer: TYPE = REF ComposerRec;
ComposerRec: TYPE = RECORD [
object: Pipal.Object, -- enumerated object provides correct childIndex for bindings
ports: REF PortsSequence,
nodes: SEQUENCE size: NAT OF Node
size>=ports.size.
first nodes corresponds to ports, in the same order.
];
PortsSequence: TYPE = RECORD [ports: SEQUENCE size: NAT OF Pipal.Object];
Node: TYPE = REF NodeRec;
NodeRec: TYPE = RECORD [
bindings: SEQUENCE size: NAT OF Binding
Bindings are guaranteed to be sorted in lexicographic order (lowest childIndex first)
];
Binding: TYPE = RECORD [childIndex, nodeIndex: NAT];
childIndex refers to the index obtained when enumerating the composite connector.
children[childIndex] must be composite.
GetComposerProc: TYPE = PROC [object: Pipal.Object, mode: Mode, privateArea: PipalInt.Rectangle] RETURNS [cc: Composer];
Can only be called if GetType[object, mode] is composite.
privateArea is the area in which nodes are not promoted.
eachInstance is called first on all sub-composite connectors, then eachNode is called on each node.
GetComposer: GetComposerProc;
Applies the enumerateNodes method.
If none then applies GetEnumerationComposer.
Two invocations of that function with same object, mode and privateArea returns the same Composer.
EnumerationComposer: GetComposerProc;
Enumerate the object, and creates a Composer. Typically used for overlay.
AbutComposer: GetComposerProc;
Faster than GetEnumerationComposer for abuts.
RoutingComposer: GetComposerProc;
Faster than GetEnumerationComposer for routing objects.
TilingComposer: GetComposerProc;
Faster than GetEnumerationComposer for tilings.
Mode
Connectizing requires a few parameters, summarized in Mode.
Mode: TYPE = REF ModeRec;
ModeRec: TYPE = RECORD [
getTypeMethod, enumeratePortsMethod, getComposerMethod: Pipal.Method,
methods for recursion.
name: Pipal.ROPE,
identifies the mode
touch: PipalMos.TouchProc,
Specifies if two decorations touch and provoke a geometric fusion.
nbOfLayers: NAT ← 1,
determines the number of interesting layers corresponding to subinstances of obj. Efficiency hack: should be defaulted for clients unaware of implementation details. Also note layer means in this context "virtual layers", not PipalMos.Layer.
objectLayer: PROC [Pipal.Object] RETURNS [LayerRange] ← NIL
determines the [min .. max] layers corresponding to a subinstance of obj. Efficiency hack: should be set to DefaultObjectLayer for clients unaware of implementation details.
];
LayerRange: TYPE = RECORD [min, max: NAT];
min and max are included
Some Connectize Modes
layoutMode: Mode;
Default mode for layout.
schematicMode: Mode;
Default mode for schematics.
rawLayoutMode: Mode;
Same as layoutMode, but deals with overlap.
Exceptions
ConnectizeProcs, may raise the following exceptions.
InternalBug: SIGNAL [];
Please notify maintainors.
CallerBug: SIGNAL [];
Something is obviously wrong in client code.
END.