<> <> <> <<>> DIRECTORY Convert, Core, CoreClasses, CoreFlat, CoreOps, CoreProperties, Rope, spMain, spGlobals, SymTab, TiogaFileOps, ViewerTools; <<>> JasmineThyme: CEDAR PROGRAM IMPORTS Convert, CoreClasses, CoreFlat, CoreOps, CoreProperties, Rope, spMain, spGlobals, SymTab, TiogaFileOps, ViewerTools = BEGIN TNode: TYPE = TiogaFileOps.Ref; nodeProp: ATOM = CoreProperties.RegisterProperty[$JasmineNode]; hasNameProp: ATOM = CoreProperties.RegisterProperty[$JasmineNameProp]; <<>> CreateThymeFile: PROC [model: SymTab.Ref, outputFile: Core.ROPE] = { root: TNode _ TiogaFileOps.CreateRoot[]; PrintHeader[outputFile, root]; PrintCircuit[root]; TiogaFileOps.Store[root, outputFile] }; PrintHeader: PROC [outputFile: Core.ROPE, root: TNode] = { node: TNode; TiogaFileOps.SetStyle[root, "Cedar"]; node _ TiogaFileOps.InsertAsLastChild[root]; TiogaFileOps.SetContents[node, Rope.Cat["-- ", outputFile, "; Created by Jasmine."]]; [] _ TiogaFileOps.InsertAsLastChild[root]; }; PrintCircuit: PROC [root: TNode] = { tNode: TNode _ TiogaFileOps.InsertAsLastChild[root]; tSubNode: TNode; plotControl: Core.ROPE; TiogaFileOps.SetContents[tNode, "CIRCUIT[Lambda _ 1, TDegC _ 25] = {"]; tSubNode _ TiogaFileOps.InsertAsLastChild[tNode]; TiogaFileOps.SetContents[tSubNode, "Vdd: Node;"]; tSubNode _ TiogaFileOps.InsertAsLastChild[tNode]; TiogaFileOps.SetContents[tSubNode, "! /DATools/DATools6.0/Thyme/SignalGenerators.thy"]; tSubNode _ TiogaFileOps.InsertAsLastChild[tNode]; TiogaFileOps.SetContents[tSubNode, "! /DATools/DATools6.0/Thyme/BSim.thy\n"]; tSubNode _ TiogaFileOps.InsertAsLastChild[tNode]; TiogaFileOps.SetContents[tSubNode, "powerSupply: voltage[Vdd, Gnd] = 5.0;"]; <> PrintInstanceNodes[root, cellType, cellType.public[0]]; <<>> <> --Optional-- <> tNode _ TiogaFileOps.InsertAsLastChild[root]; plotControl _ Rope.Cat[ Rope.Cat["PLOT[\"", "Jasmine Test Model", "\", "], Rope.Cat[":", "1ns", ", "], Rope.Concat["-3", ", "], Rope.Concat["8", ", "], Rope.Concat["myGnd, jn15"] ]; plotControl _ Rope.Concat[plotControl, "];"]; TiogaFileOps.SetContents[tNode, plotControl]; <> tNode _ TiogaFileOps.InsertAsLastChild[root]; TiogaFileOps.SetContents[tNode, Rope.Cat["RUN[", Rope.Cat["tMin _ ", "0ns", ", "], Rope.Cat["tMax _ ", "200ns", "];"] ]]; }; --PrintCircuit PrintInstanceNodes: PROC [tRoot: TNode, cellType: Core.CellType, wire: Core.Wire] = { RegisterInternalNode: PROC [nodeID: INT] RETURNS [nodeIDName: Core.ROPE] = { nodeIDName _ Rope.Cat["jn", Convert.RopeFromInt[nodeID], nodeSeparator]; jasmineNodeList _ CONS[nodeIDName, jasmineNodeList]; }; --RegisterInternalNode RegisterJasmineNode: PROC [jNode: Core.ROPE] = { nodeIDName _ Rope.Cat[jNode, nodeSeparator]; jasmineNodeList _ CONS[nodeIDName, jasmineNodeList]; }; --RegisterJasmineNode AccumulateNode: CoreFlat.EachInternalWireProc --[bindings: HashTable.Table, path: PackedPath, cellType: Core.CellType, wire: Core.Wire]-- = { jasmineNodeName: Core.ROPE _ NIL; RegisterJasmineNode[CoreOps.GetShortWireName[wire]]; IF (jasmineNodeName_NARROW[CoreProperties.GetWireProp[from: wire, prop: nodeProp]])#NIL THEN RegisterJasmineNode[jasmineNodeName]; }; --AccumulateNode AccumulateInstance: CoreFlat.EachWireInstanceProc --[bindings: HashTable.Table, path: PackedPath, instance: CoreClasses.CellInstance, wire: Core.Wire] RETURNS [flatten: BOOL _ TRUE]-- = { NameInstance: PROC[inst: CoreClasses.CellInstance] RETURNS [name: Core.ROPE] = { name _ CoreClasses.GetCellInstanceName[inst]; IF CoreProperties.GetCellInstanceProp[inst, hasNameProp]#NIL THEN RETURN; IF name=NIL THEN { name _ Rope.Cat["Block", Convert.RopeFromInt[instID]]; instID _ instID.SUCC; }; [] _ CoreClasses.SetCellInstanceName[inst, name]; CoreProperties.PutCellInstanceProp[inst, hasNameProp, hasNameProp]; }; SELECT instance.type.class FROM CoreClasses.recordCellClass => { subTNodeInstance _ Rope.Cat[ Rope.Cat[NameInstance[instance], ": ", CoreOps.GetCellTypeName[instance.type]], "[", CoreOps.GetShortWireName[instance.actual], "];"]; }; < {>> <> <> <> <> <