-- ChipAppendNames.mesa
-- Subroutines to append the names of various things to
-- strings.
-- last modified by E. McCreight, September 12, 1983 11:26 AM
-- written by E. McCreight, November 3, 1981 3:06 PM
DIRECTORY
ChipNetDefs,
ChipUserInt,
InlineDefs,
ppdefs,
StringDefs;
ChipAppendNames: PROGRAM
IMPORTS ChipNetDefs, ChipUserInt, InlineDefs,
ppdefs, StringDefs
EXPORTS ChipNetDefs =
BEGIN OPEN ppdefs, ChipNetDefs;
AppendNet: PUBLIC PROCEDURE[s: STRING, net: netPtr]
RETURNS[cn: CanonNetPtr] =
BEGIN OPEN StringDefs;
cn ← CanonNet[net];
WITH did: (cn ← CanonNet[net]).id SELECT FROM
normal => AppendNetId[s, @did];
ENDCASE => ChipUserInt.Explain["Extractor bug - bogus net"];
END;
nextNumericNet: locNum ← 1;
AppendNetId: PUBLIC PROCEDURE[s: STRING,
netId: NormalNetIdPtr] =
BEGIN OPEN StringDefs;
IF netId.nameClass=anonymous THEN
BEGIN
netId.name ← numeric[n: nextNumericNet];
nextNumericNet ← nextNumericNet+1;
END;
WITH dn: netId SELECT FROM
numeric => {AppendChar[s, 'N]; AppendCard[s, dn.n]};
qualified => AppendTerminalName[s, [dn.source, dn.see]];
named => AppendAtom[s, dn.name];
ENDCASE => ERROR;
END; -- of AppendNetId
AppendTerminalName: PUBLIC PROCEDURE[s: STRING,
c: ItemRef] =
BEGIN OPEN StringDefs;
oldLen: CARDINAL ← s.length;
AppendCallerChain[s, c.head];
IF s.length>oldLen THEN AppendChar[s, '.];
AppendLongString[s, AtomToString[FindPropValue[ItemRefToLp[c], signalName]]];
END; -- of AppendTerminalName
AppendCallerChain: PUBLIC PROCEDURE[s: STRING,
c: InstancePtr] =
BEGIN OPEN StringDefs;
IF c.caller.head#NIL THEN
BEGIN
oldLen: CARDINAL ← s.length;
AppendCallerChain[s, c.caller.head];
IF s.length>oldLen THEN AppendChar[s, '.];
AppendCallerLink[s, c];
END;
END; -- of AppendCallerChain
AppendCallerLink: PUBLIC PROCEDURE[s: STRING,
c: InstancePtr] =
BEGIN OPEN StringDefs;
v: Atom ← FindPropValue[ItemRefToLp[c.caller], instanceName];
lp: listPtr ← ItemRefToLp[c.caller];
i: CARDINAL ← 1;
IF v#NIL THEN AppendLongString[s, AtomToString[v]]
-- assumes instances are named uniquely
ELSE -- anonymous instance
BEGIN
WITH dob: lp.ob SELECT FROM
cell =>
BEGIN
sameCellCnt: CARDINAL ← 0;
IF c.proto.name#NIL THEN
AppendString[s, c.proto.name]
ELSE
BEGIN
cellNo: CARDINAL ← 1;
AppendString[s, "AnonCell"];
FOR ob: LONG POINTER TO cell object ←
GetCellSuper[], ob.super
WHILE ob#lp.ob AND ob#NIL DO
cellNo ← cellNo+1;
ENDLOOP;
AppendCard[s, cellNo];
END;
FOR lpp: listPtr ← c.caller.head.proto.lp, lpp.nxt
WHILE lpp#NIL DO
IF lpp.ob=lp.ob THEN
BEGIN
sameCellCnt ← sameCellCnt+1;
IF (lpp.lx<lp.lx OR (lpp.lx=lp.lx AND lpp.ly<lp.ly))
THEN i ← i+1;
END;
ENDLOOP;
IF sameCellCnt>1 THEN
{AppendChar[s, '#]; AppendCard[s, i]};
END;
xstr =>
BEGIN
AppendString[s, "Q"];
FOR lpp: listPtr ← c.caller.head.proto.lp, lpp.nxt
WHILE lpp#NIL DO
IF lpp.ob.otyp=xstr AND
(lpp.lx<lp.lx OR (lpp.lx=lp.lx AND lpp.ly<lp.ly))
THEN i ← i+1;
ENDLOOP;
AppendCard[s, i];
END;
cont =>
BEGIN
AppendString[s, "J"];
FOR lpp: listPtr ← c.caller.head.proto.lp, lpp.nxt
WHILE lpp#NIL DO
IF lpp.ob.otyp=cont AND
(lpp.lx<lp.lx OR (lpp.lx=lp.lx AND lpp.ly<lp.ly))
THEN i ← i+1;
ENDLOOP;
AppendCard[s, i];
END;
bus =>
BEGIN
AppendString[s, "Bus"];
FOR lpp: listPtr ← c.caller.head.proto.lp, lpp.nxt
WHILE lpp#NIL DO
IF lpp.ob.otyp=bus AND
(lpp.lx<lp.lx OR (lpp.lx=lp.lx AND lpp.ly<lp.ly))
THEN i ← i+1;
ENDLOOP;
AppendCard[s, i];
END;
ENDCASE => NULL;
END;
END; -- of AppendCallerLink
AppendLocNum: PUBLIC PROCEDURE[s: STRING, n: locNum] =
BEGIN OPEN StringDefs;
AppendChar[s, ' ];
IF n<0 THEN {AppendChar[s, '-]; n ← -n};
AppendCard[s, n/Lambda];
END;
AppendCoord: PUBLIC PROCEDURE[s: STRING, n: Coord] =
BEGIN OPEN StringDefs;
AppendChar[s, ' ];
IF n<0 THEN {AppendChar[s, '-]; n ← -n};
AppendCard[s, n];
END;
AppendCard: PUBLIC PROCEDURE[s: STRING,
n: LONG CARDINAL] =
BEGIN OPEN StringDefs;
IF n>9 THEN {AppendCard[s, n/10]; n ← n MOD 10};
AppendChar[s, '0+InlineDefs.LowHalf[n]];
END;
AppendLongString: PUBLIC PROC [to, from: LONG STRING] =
BEGIN
FOR i: CARDINAL IN [0..from.length) DO
to[to.length+i] ← from[i];
ENDLOOP;
to.length ← to.length+from.length;
END;
AppendAtom: PUBLIC PROC [s: LONG STRING, atom: Atom] =
{AppendLongString[to: s, from: LOOPHOLE[atom, LONG STRING]]};
FindPropValue: PUBLIC PROC [lp: listPtr, attribute: Atom] RETURNS [value: Atom] =
BEGIN
IF lp#NIL THEN
FOR p: propPtr ← lp.props, p.next WHILE p#NIL DO
IF p.attribute=attribute THEN RETURN[p.value];
ENDLOOP;
RETURN[NIL];
END;
signalName: PUBLIC Atom = MakeAtom["Signal name"];
instanceName: PUBLIC Atom = MakeAtom["Instance name"];
END. -- of ChipAppendNames