<> <> <> <> <<>> DIRECTORY Core, CoreBoole, CoreBooleExtras, CoreOps, CoreProperties, FS, IO, Process, Rope, RopeList, TerminalIO; CoreBooleExtrasImpl: CEDAR PROGRAM IMPORTS CoreBoole, CoreOps, CoreProperties, FS, IO, Rope, RopeList, TerminalIO EXPORTS CoreBooleExtras = BEGIN OPEN CoreBooleExtras; false: Expression = CoreBoole.false; true: Expression = CoreBoole.true; Size: PUBLIC PROC [expr: Expression] RETURNS [size: INT _ 0] = { var: ROPE _ CoreBoole.FindVar[expr]; whenTrue, whenFalse: Expression; IF var=NIL THEN RETURN; [whenTrue, whenFalse] _ CoreBoole.Eval[var, expr]; IF CoreBoole.Equal[whenTrue, true] OR CoreBoole.Equal[whenTrue, false] THEN RETURN[Size[whenFalse]]; IF CoreBoole.Equal[whenFalse, true] OR CoreBoole.Equal[whenFalse, false] THEN RETURN[Size[whenTrue]]; size _ 1 + Size[whenTrue] + Size[whenFalse]; }; Reorder: PUBLIC PROC [expr: Expression, public: Wire] RETURNS [newExpr: Expression] = { vars: LIST OF ROPE _ NIL; AddToVars: CoreOps.EachWireProc = { IF wire.size=0 THEN vars _ CONS [CoreOps.GetShortWireName[wire], vars]; }; [] _ CoreOps.VisitWire[public, AddToVars]; vars _ RopeList.Reverse[vars]; RETURN [ReorderVars[expr, vars]]; }; ReorderVars: PUBLIC PROC [expr: Expression, vars: LIST OF ROPE] RETURNS [newExpr: Expression] = { var: ROPE; whenTrue, whenFalse: Expression; IF expr=true OR expr=false THEN RETURN [expr]; var _ vars.first; [whenTrue, whenFalse] _ CoreBoole.Eval[var, expr]; newExpr _ CoreBoole.If[CoreBoole.Var[var], ReorderVars[whenTrue, vars.rest], ReorderVars[whenFalse, vars.rest]]; }; coreBoolePermuteProp: PUBLIC ATOM _ CoreProperties.RegisterProperty[$CoreBoolePermuteProp]; Permute: PUBLIC PROC [expr: Expression, public: Wire] RETURNS [bestPermutedExpr: Expression, bestPermutedWire: Wire] = { <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <> <> <> <> <> <> <<};>> <> <> <> <> <> <> <> <> <> <> <> <<};>> <> <> <> <> <