EcadCDCmds.mesa
Copyright Ó 1987 by Xerox Corporation. All rights reserved.
Christian Le Cocq November 23, 1987 12:31:24 pm PST
DIRECTORY
CedarProcess USING [SetPriority, GetPriority, Priority],
CifToCD USING [ReadFile],
CD USING [Design, Instance],
CDCells USING [IsPushedIn],
CDCommandOps USING [RegisterWithMenu],
CDDirectory USING [Name],
CDImports USING [HasUnloadedImports],
CDOps USING [TheInstance, RedrawInstance],
CDSequencer USING [Command],
CDToCif USING [WriteCIF],
EcadOps USING [ExecuteRemoteECAD, WaitForOk, noError],
FS USING [StreamOpen, Error],
IO USING [STREAM],
Rope USING [ROPE, Cat],
TerminalIO USING [PutRope, PutRopes]
;
EcadCDCmds: CEDAR PROGRAM
IMPORTS
CedarProcess, CifToCD, CDCells, CDCommandOps, CDDirectory, CDImports, CDOps, CDToCif, EcadOps, FS, Rope, TerminalIO
EXPORTS
EcadOps
~ BEGIN
cifExt: Rope.ROPE ← ".cif";
errExt: Rope.ROPE ← ".errors.cif";
defaultRulesName: Rope.ROPE ← "VTI";
cifPerLambda: INT ← 100;
flattenAtomics: BOOLEANTRUE;
ecadKey: ATOM ← $EcadErrorsCif; --to identify the set of cif conventions
EcadDRCCmd: PROC [comm: CDSequencer.Command] ~ {
Called by ChipNDale upon activation of the command.
msg: Rope.ROPE;
mainInst: CD.Instance;
IF CDCells.IsPushedIn[comm.design] THEN {
TerminalIO.PutRope["**Design is pushed in\n"];
GOTO Exit
};
IF CDImports.HasUnloadedImports[comm.design].yes THEN {
TerminalIO.PutRope["**Design has non bound imports\n"];
GOTO Exit
};
mainInst ← CDOps.TheInstance[comm.design, "cif generation\n"];
IF mainInst=NIL THEN {
TerminalIO.PutRope["**CIF generation needs single selected object\n"];
GOTO Exit
};
msg ← DRCInstance[mainInst, comm.design, defaultRulesName];
TerminalIO.PutRope[" Dracula cmd finished\n"];
EXITS Exit => {};
};
DRCInstance: PROC [instance: CD.Instance, design: CD.Design, rules: Rope.ROPE] RETURNS [msg: Rope.ROPENIL] ~ {
priority: CedarProcess.Priority ← CedarProcess.GetPriority[];
CedarProcess.SetPriority[background];
{
topCellName, fileName: Rope.ROPE;
cifFile: IO.STREAM;
topCellName ← CDDirectory.Name[instance.ob, design];
IF topCellName=NIL THEN RETURN["Impossible to DRC non named objects"];
fileName ← Rope.Cat[topCellName, cifExt];
cifFile ← FS.StreamOpen[fileName, create ! FS.Error => IF error.group#bug THEN {
msg ← error.explanation;
CONTINUE;
}];
IF msg#NIL THEN GOTO Failed;
TerminalIO.PutRopes["Dracula DRC. CIF file: ", fileName, "\n"];
msg ← CDToCif.WriteCIF[design, instance, cifFile, cifPerLambda, flattenAtomics];
IF msg#NIL THEN GOTO Failed;
msg ← EcadOps.ExecuteRemoteECAD[topCellName, rules];
IF msg#NIL THEN GOTO Failed;
msg ← EcadOps.WaitForOk[topCellName];
IF msg#NIL THEN GOTO Failed;
fileName ← Rope.Cat[topCellName, errExt];
cifFile ← FS.StreamOpen[fileName, read ! FS.Error => IF error.group#bug THEN {
msg ← error.explanation;
CONTINUE;
}];
IF msg#NIL THEN GOTO Failed;
msg ← CifToCD.ReadFile[cifFile, design, ecadKey, instance.trans];
IF msg#NIL THEN GOTO Failed;
CedarProcess.SetPriority[priority];
CDOps.RedrawInstance[design, instance];
EXITS Failed => {
TerminalIO.PutRope[msg];
CedarProcess.SetPriority[priority];
};
};
};
CheckDRC: PUBLIC PROC [instance: CD.Instance, design: CD.Design, rules: Rope.ROPE] RETURNS [noErrors: BOOLEAN] ~ {
msg: Rope.ROPE ← DRCInstance[instance, design, rules];
RETURN[msg=EcadOps.noError];
};
CDCommandOps.RegisterWithMenu [menu: $ProgramMenu, entry: "Dracula", doc: "Flat DRC on remote Unix host", key: $DraculaSel, proc: EcadDRCCmd];
END.