ReadCifImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
by Jim Gasbarro March 12, 1985 12:38:00 pm PST
Ripped off from: MPCControl.Mesa
Last Edited by: Gasbarro, January 16, 1987 4:07:21 pm PST
Bertrand Serlet May 21, 1987 5:47:32 pm PDT
McCreight, April 14, 1986 3:29:33 pm PST
DIRECTORY
CD, CDCommandOps, CDIO, CDSequencer, Commander, CommandTool, IntDefs, IO, IODefs, LayerFileDefs, MPCDefs, MPCParserDefs, OutputDefs, ParserDefs, ParserErrorDefs, ParserInputDefs, ReadCif, Rope, TerminalIO;
ReadCifImpl: CEDAR PROGRAM
IMPORTS
CDCommandOps, CDIO, Commander, CommandTool, IntDefs, IO, IODefs, OutputDefs, ParserDefs, ParserErrorDefs, ParserInputDefs, ReadCif, Rope, TerminalIO
EXPORTS
ReadCif =
BEGIN
designName: PUBLIC Rope.ROPE;
cifUnitsPerLambda: PUBLIC CARDINAL;
ReadCifCDMenu: PROC [comm: CDSequencer.Command] ~ {
fname: Rope.ROPE;
TerminalIO.PutRope["Cif file name?\n"];
fname ← TerminalIO.RequestRope[">> "];
ReadFile[fname, comm.design];
};
ReadCifCmdTool: Commander.CommandProc = {
ENABLE TerminalIO.UserAbort => {GOTO abort};
argv: CommandTool.ArgumentVector ← CommandTool.Parse[cmd: cmd
! CommandTool.Failed => {msg ← errorMsg; GO TO failed}];
fname: Rope.ROPE;
FOR i: NAT IN [1..argv.argc) DO
fname ← argv[i];
IF Rope.Length[fname] = 0 THEN LOOP ELSE EXIT;
ENDLOOP;
ReadFile[fname];
EXITS
failed => {result ← $Failure};
abort => {result ← $Failure; msg ← "aborted"};
};
ReadFile: PROC [fname: Rope.ROPE, into: CD.Design ← NIL] = {
ENABLE TerminalIO.UserAbort => {GOTO abort};
ok: BOOLEANTRUE;
aborted: BOOLEANFALSE;
errorSummary: ARRAY ParserErrorDefs.ErrorType OF CARDINALALL[0];
fname ← CDIO.MakeName[base: fname, ext: "cif", wDir: CDIO.GetWorkingDirectory[], modifier: NIL];
IF ~OutputDefs.FinishOutput[] THEN GO TO failed; --make sure we cleaned up
IF ~ParserDefs.InitParser[] OR ~ParserInputDefs.InFromFile[fname] THEN GO TO failed;
IF ~IntDefs.InitInterpreter[] THEN GO TO failed;
ReadCif.design ← into;
ReadCif.designName ← fname;
TerminalIO.PutRope["How many CIF units per lambda? (1 CIF unit = 0.01 microns)\n"];
ReadCif.cifUnitsPerLambda ← TerminalIO.RequestInt[">> "];
Main loop to convert CIF file
BEGIN
ENABLE
ParserErrorDefs.ParserAbort =>
BEGIN aborted ← TRUE; IODefs.WriteLine["---Parser aborted---"]; CONTINUE; END;
nStatements: INT ← 0;
DO
SELECT ParserDefs.ParseStatement[] FROM
End => BEGIN nStatements ← nStatements + 1; EXIT; END;
SemanticError, SyntaxError =>
IF ParserInputDefs.EndOfFile[] THEN aborted ← TRUE;
ENDCASE;
nStatements ← nStatements + 1;
IF nStatements MOD 100 = 0 THEN
IODefs.PostIt[IO.PutFR["CIF File: %g, Statement: %g...", IO.rope[fname], IO.int[nStatements]]];
IF ParserInputDefs.EndOfFile[] THEN
BEGIN
IODefs.WriteLine[
"Unexpected end of input file, Probably missing End command"];
aborted ← TRUE;
END;
ENDLOOP;
END; --End of Enable clause
errorSummary ← ParserErrorDefs.ErrorSummary[];
[] ← ParserDefs.FinishParser[];
ok ← ~aborted
AND
(errorSummary[Fatal] + errorSummary[FatalSyntax] + errorSummary[
FatalSemantic] + errorSummary[FatalInternal]) = 0;
IF ok THEN IntDefs.Instantiate[];
[] ← IntDefs.FinishInterpreter[];
[] ← OutputDefs.FinishOutput[];
EXITS
failed => {};
abort => {};
};
doc: Rope.ROPE = "Chipndale command to read Cif format design files";
Commander.Register[key: "ReadCif", proc: ReadCifCmdTool, doc: doc];
CDCommandOps.RegisterWithMenu[menu: $ProgramMenu, entry: "ReadCif", doc: "Read a cif file into this design", key: $ReadCif, proc: ReadCifCDMenu];
END.