<> <> <> <> <> <> <<>> DIRECTORY CDIO, Commander, CommandTool, IntDefs, IO, IODefs, LayerFileDefs, MPCDefs, MPCParserDefs, OutputDefs, ParserDefs, ParserErrorDefs, ParserInputDefs, ReadCif, Rope, TerminalIO; ReadCifImpl: CEDAR PROGRAM IMPORTS CDIO, Commander, CommandTool, IntDefs, IO, IODefs, OutputDefs, ParserDefs, ParserErrorDefs, ParserInputDefs, ReadCif, Rope, TerminalIO EXPORTS ReadCif = BEGIN designName: PUBLIC Rope.ROPE; cifUnitsPerLambda: PUBLIC CARDINAL; ReadCifFile: Commander.CommandProc = BEGIN ENABLE TerminalIO.UserAbort => {GOTO abort}; argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd: cmd ! CommandTool.Failed => {msg _ errorMsg; GO TO failed}]; fname: Rope.ROPE; ok: BOOLEAN _ TRUE; errorSummary: ARRAY ParserErrorDefs.ErrorType OF CARDINAL _ ALL[0]; aborted: BOOLEAN _ FALSE; FOR i: NAT IN [1..argv.argc) DO fname _ argv[i]; IF Rope.Length[fname] = 0 THEN LOOP ELSE EXIT; ENDLOOP; fname _ CDIO.MakeName[base: fname, ext: "cif", wDir: NIL, 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.designName _ fname; TerminalIO.WriteRope["How many CIF units per lambda? (1 CIF unit = 0.01 microns)\n"]; ReadCif.cifUnitsPerLambda _ TerminalIO.RequestInt[">> "]; <
> 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 => {result _ $Failure}; abort => {result _ $Failure; msg _ "aborted"}; END; doc: Rope.ROPE = "Chipndale command to read Cif format design files"; Commander.Register[key: "///Commands/ReadCif", proc: ReadCifFile, doc: doc]; END.