SCTestUtilImpl.mesa
Copyright © 1985, 1986 by Xerox Corporation. All rights reserved.
Bryan Preas, March 24, 1986 6:05:04 pm PST
DIRECTORY
CD,
CDCells,
CDDirectory,
CDIO,
Core,
CoreClasses,
CoreCompose,
CoreOps,
CoreProperties,
Rope,
SCTestUtil,
TerminalIO,
SC;
SCTestUtilImpl: CEDAR PROGRAM
IMPORTS CDCells, CDDirectory, CDIO, CoreClasses, CoreCompose, CoreOps, CoreProperties, Rope, SC, TerminalIO
EXPORTS SCTestUtil =
BEGIN
CreateInstance: PUBLIC PROC [context: CoreCompose.Context, actual: Rope.ROPE, type: Core.CellType, name: Rope.ROPE] RETURNS [instance: CoreClasses.CellInstance] = {
create a cell instance rec
instance ← NEW[CoreClasses.CellInstanceRec ← [CoreCompose.CreateWires[context, actual], type, NIL]];
CoreProperties.PutCellInstanceProp[instance, CoreClasses.instanceNameProp, name]};
CreateRecordCell: PUBLIC PROC [context: CoreCompose.Context, name: Rope.ROPE, public: Core.WireSequence, onlyInternal: Core.WireSequence ← NIL, instances: CoreClasses.CellInstanceList ← NIL] RETURNS [cellType: Core.CellType] = {
create a cell instance rec
internal: Core.WireSequence ← WireUnion[public, onlyInternal];
recCell: CoreClasses.RecordCellType ← NEW [CoreClasses.RecordCellTypeRec ← [
internal: internal,
instances: instances]];
cellType ← CoreOps.CreateCellType[
name: name,
class: CoreClasses.recordCellClass,
public: public,
data: recCell];
};
w1.elements#NIL and w2.elements#NIL
WireUnion: PUBLIC PROC [w1, w2: Core.WireSequence] RETURNS [union: Core.WireSequence] = {
IF w1=NIL THEN RETURN [w2];
IF w2=NIL THEN RETURN [w1];
union ← NEW [Core.WireSequenceRec[w1.size+w2.size]];
FOR i: INT IN [0..w1.size) DO union[i] ← w1[i] ENDLOOP;
FOR i: INT IN [0..w2.size) DO union[i+w1.size] ← w2[i] ENDLOOP;
};
AppendInstList: PUBLIC PROC [l1, l2: CoreClasses.CellInstanceList]
RETURNS[val: CoreClasses.CellInstanceList] = {
z: CoreClasses.CellInstanceList ← NIL;
val ← l2;
IF l1 = NIL THEN RETURN[val];
val ← CONS[l1.first, val];
z ← val;
UNTIL (l1 ← l1.rest) = NIL DO
z.rest ← CONS[l1.first, z.rest];
z ← z.rest;
ENDLOOP;
RETURN[val];
};
WriteLayout: PUBLIC PROC [result: SC.Result, design: CD.Design] =
Write a standard cell object to a CND design
BEGIN
[] ← CDCells.IncludeOb[design: design,
cell: NIL, ob: result.object, position: [0, 0], orientation: CD.original,
cellCSystem: interrestCoords, obCSystem: interrestCoords, mode: dontPropagate];
IF CDIO.WriteDesign[design, result.handle.name] THEN
BEGIN
newCellName: Rope.ROPE ← CDDirectory.Name[result.object];
IF ~Rope.Equal[result.handle.name, newCellName] THEN
TerminalIO.WriteRope[Rope.Cat["cell name changed to: ", newCellName, "\n"]];
END
ELSE
TerminalIO.WriteRope["Error: design not written\n"];
END;
DoLayout: PUBLIC PROC [context: CoreCompose.Context, cellType: Core.CellType, cdDesign, libDesign: CD.Design, hMaterial, vMaterial: Rope.ROPE] RETURNS [result: SC.Result ← NIL] =
Create a standard cell object
BEGIN
rules: SC.DesignRules ← SC.CreateDesignRules[cdDesign.technology.key, hMaterial, vMaterial, horizontal];
handle: SC.Handle ← SC.CreateHandle[context, cellType, cdDesign, libDesign, rules, "SCTest"];
SC.InitialPlace[handle, 0];
SC.GlobalRoute[handle];
SC.PlaceImprove[handle, $globalRouting];
result ← SC.DetailRoute[handle];
END;
END.