// file: a10.rex // author: R. Keller // purpose: Solution to rex part of a10 /* CS 60, Fall 2003, Assignment 9, rex part The allowed rex functions are (n is arbitrary in each case): or(x1, x2, ..., xn), alternatively x1 || x2 || ... || xn and(x1, x2, ..., xn), alternatively x1 && x2 && ... && xn not(x1), alternatively !x1 */ /* Problem 1: define DecimalDigitToBCD */ DecimalDigitToBCD(0) => [0, 0, 0, 0]; DecimalDigitToBCD(1) => [0, 0, 0, 1]; DecimalDigitToBCD(2) => [0, 0, 1, 0]; DecimalDigitToBCD(3) => [0, 0, 1, 1]; DecimalDigitToBCD(4) => [0, 1, 0, 0]; DecimalDigitToBCD(5) => [0, 1, 0, 1]; DecimalDigitToBCD(6) => [0, 1, 1, 0]; DecimalDigitToBCD(7) => [0, 1, 1, 1]; DecimalDigitToBCD(8) => [1, 0, 0, 0]; DecimalDigitToBCD(9) => [1, 0, 0, 1]; /* Problem 2: define BCDtoSevenSegment */ BCDtoSevenSegment([b3, b2, b1, b0]) => [or( b3, b2 && b0, !b2 && !b0, b1 ), or( b3, b2 && !b1, b2 && !b0, !b1 && !b0 ), or( !b2, b1 && b0, !b1 && !b0 ), or( b3, b2 && !b1, !b2 && b1, b1 && !b0 ), or( !b2 && !b0, b1 && !b0 ), or( b2, !b1, b0 ), or( b3, !b2 && !b0, !b2 && b1, b2 && !b1 && b0, b1 && !b0 ) ]; /* Functions for testing */ decimalToSevenSegment(0) => [1, 1, 1, 0, 1, 1, 1]; decimalToSevenSegment(1) => [0, 0, 1, 0, 0, 1, 0]; decimalToSevenSegment(2) => [1, 0, 1, 1, 1, 0, 1]; decimalToSevenSegment(3) => [1, 0, 1, 1, 0, 1, 1]; decimalToSevenSegment(4) => [0, 1, 1, 1, 0, 1, 0]; decimalToSevenSegment(5) => [1, 1, 0, 1, 0, 1, 1]; decimalToSevenSegment(6) => [1, 1, 0, 1, 1, 1, 1]; decimalToSevenSegment(7) => [1, 0, 1, 0, 0, 1, 0]; decimalToSevenSegment(8) => [1, 1, 1, 1, 1, 1, 1]; decimalToSevenSegment(9) => [1, 1, 1, 1, 0, 1, 1]; sevenSegmentToDecimal([1, 1, 1, 0, 1, 1, 1]) => 0; sevenSegmentToDecimal([0, 0, 1, 0, 0, 1, 0]) => 1; sevenSegmentToDecimal([1, 0, 1, 1, 1, 0, 1]) => 2; sevenSegmentToDecimal([1, 0, 1, 1, 0, 1, 1]) => 3; sevenSegmentToDecimal([0, 1, 1, 1, 0, 1, 0]) => 4; sevenSegmentToDecimal([1, 1, 0, 1, 0, 1, 1]) => 5; sevenSegmentToDecimal([1, 1, 0, 1, 1, 1, 1]) => 6; sevenSegmentToDecimal([1, 0, 1, 0, 0, 1, 0]) => 7; sevenSegmentToDecimal([1, 1, 1, 1, 1, 1, 1]) => 8; sevenSegmentToDecimal([1, 1, 1, 1, 0, 1, 1]) => 9; /* define BCDtoDecimalDigit */ BCDtoDecimalDigit([0, 0, 0, 0]) => 0; BCDtoDecimalDigit([0, 0, 0, 1]) => 1; BCDtoDecimalDigit([0, 0, 1, 0]) => 2; BCDtoDecimalDigit([0, 0, 1, 1]) => 3; BCDtoDecimalDigit([0, 1, 0, 0]) => 4; BCDtoDecimalDigit([0, 1, 0, 1]) => 5; BCDtoDecimalDigit([0, 1, 1, 0]) => 6; BCDtoDecimalDigit([0, 1, 1, 1]) => 7; BCDtoDecimalDigit([1, 0, 0, 0]) => 8; BCDtoDecimalDigit([1, 0, 0, 1]) => 9; /* A function 'display' that will print out a seven-segment encoding in a manner simulating an LED display, e.g. rex > display(decimalToSevenSegment(9)); ****** * * * * * * ****** * * * */ // format seven-segment code as a mock LED display display([s0, s1, s2, s3, s4, s5, s6]) => concat("\n", s0 ? "******" : " ", "\n", s1 ? "* " : " ", s2 ? "*" : " ", "\n", s1 ? "* " : " ", s2 ? "*" : " ", "\n", s1 ? "* " : " ", s2 ? "*" : " ", "\n", s3 ? "******" : s1 ? (s2 ? "* *" : "*") : (s2 ? " *" : ""), "\n", s4 ? "* " : " ", s5 ? "*" : " ", "\n", s4 ? "* " : " ", s5 ? "*" : " ", "\n", s4 ? "* " : " ", s5 ? "*" : " ", "\n", s6 ? "******" : " ", "\n", "\n"); /* The following is an illustration of the 7-segment code. */ showAll() = map((N) => display(decimalToSevenSegment(N)), range(0, 9)); test() = map((N) => sevenSegmentToDecimal(BCDtoSevenSegment(DecimalDigitToBCD(N))), range(0, 9)); test(test(), range(0, 9)); testec() = test( map((X) => BCDtoDecimalDigit(SevenSegmentToBCD(decimalToSevenSegment(X))) == X, range(0, 9)), [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] );