<> <> <> <> DIRECTORY CD, PW, TerminalIO; PWDemo: CEDAR PROGRAM IMPORTS PW, TerminalIO = BEGIN OPEN CD, PW; powersOfTwo: ARRAY [0 .. 33] OF INT = [ 1B, 2B, 4B, 1B1, 2B1, 4B1, 1B2, 2B2, 4B2, 1B3, 2B3, 4B3, 1B4, 2B4, 4B4, 1B5, 2B5, 4B5, 1B6, 2B6, 4B6, 1B7, 2B7, 4B7, 1B8, 2B8, 4B8, 1B8, 2B8, 4B8, 1B9, 2B9, 4B9, 1B10]; Generate: GeneratorProc = { zero: Object _ Get[design, "zero"]; one: Object _ Get[design, "one"]; left: Object _ Get[design, "left"]; right: Object _ Get[design, "right"]; DecGen: PROC [n: INT] RETURNS [decoder: Object] = { IF n=0 THEN RETURN [NIL] ELSE { subDecoder: Object _ DecGen [n-1]; decoder _ AbutY[ AbutX [ArrayY [zero, powersOfTwo[n-1]], subDecoder], AbutX [ArrayY [one, powersOfTwo[n-1]], subDecoder] ]; }; }; n: INT _ TerminalIO.RequestInt["How many bits in the decoder? "]; RETURN [AbutX [ ArrayY [left, powersOfTwo[n]], DecGen [n], ArrayY [right, powersOfTwo[n]] ]]; }; RegisterGenerator[Generate, "Decoder"]; END. <<>>