<> <> <> <<>> DIRECTORY CD, CDCells, CDCommandOps, CDDirectory, CDOps, CDProperties, CDSequencer, Core, CoreGeometry, CoreOps, FSM, IO, Rope, SchCDUtils, Sisyph, TerminalIO; FSMExtras: CEDAR PROGRAM IMPORTS CDCells, CDCommandOps, CDDirectory, CDOps, CDProperties, CoreOps, FSM, IO, Rope, SchCDUtils, Sisyph, TerminalIO SHARES Sisyph = BEGIN <> <> CreateFSMIconSch: PROC [comm: CDSequencer.Command] ~ { fsmName: Rope.ROPE; shortName: Rope.ROPE; iconName: Rope.ROPE; icon: CD.Object; cell: Core.CellType; shell: SchCDUtils.Shell; nms: ARRAY CoreGeometry.Side OF LIST OF Rope.ROPE; side: CoreGeometry.Side _ left; codeLine: IO.ROPE; cx: Sisyph.Context _ Sisyph.Create[comm.design]; selected: CD.Instance = CDOps.TheInstance[comm.design, "CreateFSMIcon\n"]; <<-- Get name of source and target>> IF selected=NIL THEN RETURN; fsmName _ CDDirectory.Name[selected.ob, comm.design]; IF fsmName.IsEmpty[] THEN {TerminalIO.PutF["*** Selected schematic has no name.\n"]; RETURN}; IF ~Rope.Match["*.fsm", fsmName] THEN TerminalIO.PutF["*** Convention for FSM schematics is to suffix them with '.fsm'.\n"]; shortName _ TerminalIO.RequestRope["Type icon short name: "]; IF shortName.IsEmpty[] THEN shortName _ fsmName.Substr[0, fsmName.Index[0, "."]] ELSE shortName _ shortName.Substr[0, shortName.Index[0, "."]]; iconName _ shortName.Concat[".icon"]; IF CDDirectory.Fetch[comm.design, iconName]#NIL THEN {TerminalIO.PutF["*** The icon %g already exists!\n", IO.rope[iconName]]; RETURN}; <<-- Get the source cell type>> cell _ FSM.SchMachine[cx, fsmName]; <<-- Get the names>> FOR i: INT IN [0..cell.public.size) DO nm: IO.ROPE _ CoreOps.GetShortWireName[cell.public[i]]; IF nm.Equal["Gnd"] OR nm.Equal["Vdd"] THEN {side _ right; LOOP}; nms[side] _ CONS[nm, nms[side]] ENDLOOP; <<-- Build the object, instantiate it & return>> shell _ SchCDUtils.NewShell[shortName, nms, comm.design]; shell.grid _ CDOps.GetGrid[comm.design, comm]; -- default might not be perfect... icon _ SchCDUtils.ShellObject[shell]; CDProperties.PutObjectProp[icon, Sisyph.mode.extractProcProp, $SisyphExtractCellIcon]; codeLine _ IO.PutFR["FSM.SchMachine[cx, \"%g\"]", IO.rope[fsmName]]; CDProperties.PutObjectProp[icon, $CodeFor, codeLine]; CDCells.SetSimplificationTreshhold[cell: icon, val: 30, inPixels: TRUE]; IF NOT CDDirectory.Include[comm.design, icon, iconName] THEN ERROR; -- Abnormal [] _ CDOps.IncludeObjectI[comm.design, icon, comm.pos]; TerminalIO.PutF["%g generated\n", IO.rope[iconName]]}; CreateFSMIconCode: PROC [comm: CDSequencer.Command] ~ { shortName: Rope.ROPE; iconName: Rope.ROPE; codeFor: Rope.ROPE; icon: CD.Object; cell: Core.CellType; shell: SchCDUtils.Shell; nms: ARRAY CoreGeometry.Side OF LIST OF Rope.ROPE; side: CoreGeometry.Side _ left; cx: Sisyph.Context _ Sisyph.Create[comm.design]; <<-- Get name of source and target>> shortName _ TerminalIO.RequestRope["Short name: "]; shortName _ shortName.Substr[0, shortName.Index[0, "."]]; iconName _ shortName.Concat[".icon"]; IF CDDirectory.Fetch[comm.design, iconName]#NIL THEN {TerminalIO.PutF["*** The icon %g already exists!\n", IO.rope[iconName]]; RETURN}; codeFor _ TerminalIO.RequestRope["Code: "]; <<-- Get the source cell type>> cell _ NARROW[Sisyph.EvalToRef[cx, codeFor]]; <<-- Get the names>> FOR i: INT IN [0..cell.public.size) DO nm: IO.ROPE _ CoreOps.GetShortWireName[cell.public[i]]; IF nm.Equal["Gnd"] OR nm.Equal["Vdd"] THEN {side _ right; LOOP}; nms[side] _ CONS[nm, nms[side]] ENDLOOP; <<-- Build the object, instantiate it & return>> shell _ SchCDUtils.NewShell[shortName, nms, comm.design]; shell.grid _ CDOps.GetGrid[comm.design, comm]; -- default might not be perfect... icon _ SchCDUtils.ShellObject[shell]; CDProperties.PutObjectProp[icon, Sisyph.mode.extractProcProp, $SisyphExtractCellIcon]; CDProperties.PutObjectProp[icon, $CodeFor, codeFor]; CDCells.SetSimplificationTreshhold[cell: icon, val: 30, inPixels: TRUE]; IF NOT CDDirectory.Include[comm.design, icon, iconName] THEN ERROR; -- Abnormal [] _ CDOps.IncludeObjectI[comm.design, icon, comm.pos]; TerminalIO.PutF["%g generated\n", IO.rope[iconName]]}; <> CDCommandOps.RegisterWithMenu[ menu: $SisyphIconMenu, entry: "Create Icon for FSM schematic", doc: "Create Icon for finite state machine schematic", key: $CreateFSMIconSch, proc: CreateFSMIconSch ]; CDCommandOps.RegisterWithMenu[ menu: $SisyphIconMenu, entry: "Create Icon for FSM code", doc: "Create Icon for finite state machine code", key: $CreateFSMIconCode, proc: CreateFSMIconCode ]; END.