<> <> <> <<>> DIRECTORY CDCommandOps, CDSequencer, CoreCDUser, CoreClasses, CoreCreate, CoreOps, IO, TerminalIO; CoreHacks: CEDAR PROGRAM IMPORTS CDCommandOps, CoreOps, CoreCDUser, CoreClasses, IO, TerminalIO = BEGIN OPEN CoreCreate; <> hackMenu: ATOM _ $SpecialMenu; -- where DAUserHacks commands are forcefully registered Count: PROC [cellType: CellType] RETURNS [nb: INT _ 0] ~ { data: CoreClasses.RecordCellType; cellType _ CoreOps.ToBasic[cellType]; -- think about this!!! SELECT cellType.class FROM CoreClasses.recordCellClass => { data _ NARROW[cellType.data]; FOR i: NAT IN [0..data.size) DO nb _ nb+Count[data.instances[i].type]; ENDLOOP; }; CoreClasses.transistorCellClass => RETURN [1]; ENDCASE => ERROR; }; ExtractAndMeasure: PROC [comm: CDSequencer.Command] = { Measure: CoreCDUser.EachRootCellTypeProc ~ { TerminalIO.PutF["\nEstimating transistors count\n"]; TerminalIO.PutF["%g transistors\n", IO.int[Count[root]]]; }; [] _ CoreCDUser.EnumerateSelectedCellTypes[comm.design, Measure]; }; <> CDCommandOps.RegisterWithMenu[hackMenu, "Count transistors", "Estimate number of transistors", $ExtractAndMeasure, ExtractAndMeasure]; END.