<> <> <> <> <<>> <<>> DIRECTORY Core, CoreClasses, CStitching, IO, Jasmine, JasmineModel, Real, SymTab, TerminalIO; JasmineModelImpl: CEDAR PROGRAM IMPORTS CStitching, IO, Real, SymTab, TerminalIO EXPORTS JasmineModel = BEGIN OPEN Jasmine, Real; Volts: TYPE = REAL; kOhm: TYPE = REAL; pF: TYPE = REAL; mA: TYPE = REAL; uH: TYPE = REAL; resolution: INT _ 4; CreateModel: PUBLIC PROC [tesselation: CStitching.Tesselation] RETURNS [model: SymTab.Ref] = { InsertMacro: CStitching.TileProc --PROC [tile: Tile, data: REF]-- = { AspectRatio: PROC RETURNS [ar: AspectType] = { -- Rect: TYPE = RECORD [x1, y1, x2, y2: INT]; ar _ SELECT TRUE FROM (r.x2-r.x1)>(r.y2-r.y1) => horiz, (r.x2-r.x1)<(r.y2-r.y1) => vert, ENDCASE => square; }; Branching: PROC RETURNS [branch: BranchType] = { tWest, tEast, tSouth, tNorth: CStitching.Tile; N, S, E, W: INT _ 0; tEast _ CStitching.NE[tile]; IF tEast.value#NIL THEN E _ 1; TRUSTED {tSouth _ LOOPHOLE[tile.wS]}; IF tSouth.value#NIL THEN S _ 1; tWest _ CStitching.SW[tile]; IF tWest.value#NIL THEN W _ 1; TRUSTED {tNorth _ LOOPHOLE[tile.eN]}; IF tNorth.value#NIL THEN N _ 1; SELECT (N+S+E+W) FROM 4 => branch _ fourWay; 3 => SELECT TRUE FROM N+(E+W)=3 => branch _ inverseT; N+(E+S)=3 => branch _ rightT; N+(W+S)=3 => branch _ leftT; S+(E+W)=3 => branch _ T; ENDCASE => NULL; 2 => SELECT TRUE FROM N+S=2 => branch _ straight; N+E=2 => branch _ L; N+W=2 => branch _ reverseL; S+E=2 => branch _ inverseL; S+W=2 => branch _ inverseRevL; ENDCASE => NULL; 1 => branch _ straight; ENDCASE => NULL; }; ContactResistance: PROC [] RETURNS [R: kOhm] = { R _ SELECT tileData.object FROM nDifCont => 30*1E-3, pDifCont => 120*1E-3, polyCont => 25*1E-3, ENDCASE --Via-- => 1E-3; }; WireResistance: PROC [] RETURNS [R: kOhm] = { Squares: PROC [CStitching.Rect] RETURNS [sqrs: REAL] = { length _ (r.x2-r.x1); width _ (r.y2-r.y1); IF length > width THEN sqrs _ Real.Float[length]/width ELSE sqrs _ Real.Float[width]/length; }; <> m1Resistivity: REAL _ 0.065; m2Resistivity: REAL _ 0.042; polyResistivity: REAL _ 3.5; nDifResistivity: REAL _ 35; pDifResistivity: REAL _ 120; R _ SELECT tileData.object FROM m1Wire => Squares[r]*m1Resistivity*1E-3, m2Wire => Squares[r]*m2Resistivity*1E-3, polyWire => Squares[r]*polyResistivity*1E-3, nDifWire => Squares[r]*nDifResistivity*1E-3, ENDCASE => Squares[r]*pDifResistivity*1E-3; }; WireInductance: PROC [] RETURNS [L: uH] = { }; WireCapacitance: PROC [] RETURNS [C: pF _ 0.1] = { <> <<(Area is additive; Perimeter is compounded)>> jasmineMacro.wireArea _ length*width; jasmineMacro.wirePerimeter _ 2*length+2*width; }; TransistorParameters: PROC [] = { tranData: CoreClasses.Transistor _NARROW[tileData.data]; jasmineMacro.xtorType _ SELECT tileData.object FROM nTran, nTranL => nE, pTran, pTranL => pE, ENDCASE => ERROR; jasmineMacro.xtorLength _ tranData.length; jasmineMacro.xtorWidth _ tranData.width; }; tileData: JasmineObjectInLayer _ NARROW[tile.value]; jasmineMacro: JasmineMacro _ NEW[JasmineMacroRec]; r: CStitching.Rect _ CStitching.Area[tile]; symbol: Core.ROPE; length, width: INT; jasmineMacro.macroType _ tileData.object; SELECT tileData.object FROM m1Wire, m2Wire, nDifWire, pDifWire, polyWire => { jasmineMacro.wireAspect _ AspectRatio[]; jasmineMacro.resistance _ WireResistance[]; jasmineMacro.inductance _ WireInductance[]; jasmineMacro.capacitance _ WireCapacitance[]; jasmineMacro.branch _ Branching[]; }; nDifCont, pDifCont, polyCont, Via => { jasmineMacro.resistance _ ContactResistance[]; jasmineMacro.branch _ Branching[]; }; nTran, nTranL, pTran, pTranL => {TransistorParameters[];}; ENDCASE => NULL; symbol _ MapConvert[jasmineMacro.JMapLoc _ ScaleMap[tile]]; [] _ SymTab.Store[x: model, key: symbol, val: jasmineMacro]; }; --InsertMacro model _ SymTab.Create[]; CStitching.EnumerateArea[plane: tesselation, rect: CStitching.all, eachTile: InsertMacro]; }; --CreateModel MapConvert: PUBLIC PROC [jml: JasmineModel.JasmineModelLocation] RETURNS [sym: Core.ROPE] = { sym _ IO.PutFR["[%g, %g]", IO.int[jml.row], IO.int[jml.col]]; }; ScaleMap: PROC [tile: CStitching.Tile] RETURNS [loc: JasmineModel.JasmineModelLocation] = { lambda: INT _ 8; x, y, scale: INT _ 0; r: CStitching.Rect _ CStitching.Area[tile]; IF resolution<1 THEN resolution_1; scale _ resolution*lambda; x _ Round[Float[r.x1+(r.x2-r.x1)/2]/scale]; y _ Round[Float[r.y1+(r.y2-r.y1)/2]/scale]; IF x<1 THEN x_1; IF y<1 THEN y_1; IF x>INT.LAST THEN x_INT.LAST; IF y>INT.LAST THEN y_INT.LAST; loc _ [x, y]; }; PrintModel: PROC [model: SymTab.Ref] = { PrintMacro: PROC = { FOR i: INT IN [0..model.size] DO searchLocation.row _ i; FOR j: INT IN [0..model.size] DO searchLocation.col _ j; [thereIs, val] _ SymTab.Fetch[model, MapConvert[searchLocation]]; IF thereIs THEN { macro: JasmineMacro _ NARROW[val]; TerminalIO.WriteRope["\nMacro: "]; TerminalIO.WriteRope[MapConvert[macro.JMapLoc]]; SELECT macro.macroType FROM m1Wire, m2Wire, nDifWire, pDifWire, polyWire => { IF macro.wireAspect=vert THEN TerminalIO.WriteRope[" | "] ELSE TerminalIO.WriteRope[" -- "]; TerminalIO.WriteF[" %g K ", IO.real[macro.resistance]]; }; nDifCont, pDifCont, polyCont, Via => { SELECT macro.branch FROM leftT => TerminalIO.WriteRope[" --| "]; rightT=> TerminalIO.WriteRope[" |-- "]; inverseT=> TerminalIO.WriteRope[" L "]; T=> TerminalIO.WriteRope[" T "]; L => TerminalIO.WriteRope[" L "]; reverseL => TerminalIO.WriteRope[" _L "]; inverseL => TerminalIO.WriteRope[" F "]; inverseRevL => TerminalIO.WriteRope[" _F "]; straight => TerminalIO.WriteRope[" * "]; fourWay=> TerminalIO.WriteRope[" + "]; ENDCASE => NULL; TerminalIO.WriteF[" %g K ", IO.real[macro.resistance]]; }; nTran, nTranL, pTran, pTranL => TerminalIO.WriteRope[" -[ "]; ENDCASE => NULL; macroCount _ macroCount.SUCC; }; ENDLOOP; ENDLOOP; }; val: REF ANY; thereIs: BOOL; macroCount: INT _ 0; searchLocation: JasmineModel.JasmineModelLocation; PrintMacro[]; TerminalIO.WriteF["\nTotal: %g, Scale: %g lambda\n\n", IO.int[macroCount], IO.int[resolution]]; }; --PrintModel END. <<>>