// Rudimentary pattern-matching circuit // Assignment 5 for COMP231, ??/??/01 // by Julian Graham module or_gate (in1, in2, out); input in1, in2; output out; assign out = (in1 | in2); endmodule module nwayor_gate (in1, in2, in3, out); input in1, in2, in3; output out; wire result1, result2; or_gate or1 (in1, in2, result1); or_gate or2 (in3, result1, result2); assign out = result2; endmodule module nxor_gate (in1, in2, out); input in1, in2; output out; assign out = ~(in1 ^ in2); endmodule module and_gate (in1, in2, out); input in1, in2; output out; assign out = (in1 & in2); endmodule module clc_gate (src1, src2, src3, pat1, pat2, pat3, out1, out2, out3); input src1, src2, src3, pat1, pat2, pat3; output out1, out2, out3; wire result1, result2, result3; // results for the nxors of the srcs and the pats wire result4, result5; // results for the ands of the previous results nxor_gate nxor1 (src1, pat1, result1); nxor_gate nxor2 (src2, pat2, result2); nxor_gate nxor3 (src3, pat3, result3); and_gate and1 (result1, result2, result4); and_gate and2 (result3, result4, result5); assign out1 = result5; assign out2 = src2; assign out3 = src3; endmodule module prc_gate (in1, in2, in3, in4, in5, pat1, pat2, pat3, out); input in1, in2, in3, in4, in5, pat1, pat2, pat3; output out; wire result1, result2, result3; wire source_bit1, source_bit2, source_bit3, source_bit4, source_bit5, source_bit6; wire nwayor_result1; clc_gate clc1 (in1, in2, in3, pat1, pat2, pat3, result1, source_bit1, source_bit2); clc_gate clc2 (source_bit1, source_bit2, in4, pat1, pat2, pat3, result2, source_bit3, source_bit4); clc_gate clc2 (source_bit3, source_bit4, in5, pat1, pat2, pat3, result3, source_bit5, source_bit6); nwayor_gate nxor1 (result1, result2, result3, nwayor_result1); assign out = nwayor_result1; endmodule module main_program; reg in1, in2, in3, in4, in5; reg pat1, pat2, pat3; wire out; prc_gate our_instantiation (in1, in2, in3, in4, in5, pat1, pat2, pat3, out); initial begin pat1 = 0; pat2 = 1; pat3 = 1; #1 in1 = 0; in2 = 0; in3 = 0; in4 = 0; in5 = 0; // 0 #1 in1 = 0; in2 = 0; in3 = 0; in4 = 0; in5 = 1; // 1 #1 in1 = 0; in2 = 0; in3 = 0; in4 = 1; in5 = 0; // 2 #1 in1 = 0; in2 = 0; in3 = 0; in4 = 1; in5 = 1; // 3 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 0; in5 = 0; // 4 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 0; in5 = 1; // 5 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 1; in5 = 0; // 6 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 1; in5 = 1; // 7 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 0; in5 = 0; // 8 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 0; in5 = 1; // 9 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 1; in5 = 0; // 10 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 1; in5 = 1; // 11 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 0; in5 = 0; // 12 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 0; in5 = 1; // 13 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 1; in5 = 0; // 14 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 1; in5 = 1; // 15 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 0; in5 = 0; // 16 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 0; in5 = 1; // 17 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 1; in5 = 0; // 18 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 1; in5 = 1; // 19 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 0; in5 = 0; // 20 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 0; in5 = 1; // 21 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 1; in5 = 0; // 22 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 1; in5 = 1; // 23 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 0; in5 = 0; // 24 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 0; in5 = 1; // 25 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 1; in5 = 0; // 26 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 1; in5 = 1; // 27 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 0; in5 = 0; // 28 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 0; in5 = 1; // 29 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 1; in5 = 0; // 30 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 1; in5 = 1; // 31 #1 pat1 = 1; pat2 = 0; pat3 = 1; in1 = 0; in2 = 0; in3 = 0; in4 = 0; in5 = 0; // 0 #1 in1 = 0; in2 = 0; in3 = 0; in4 = 0; in5 = 1; // 1 #1 in1 = 0; in2 = 0; in3 = 0; in4 = 1; in5 = 0; // 2 #1 in1 = 0; in2 = 0; in3 = 0; in4 = 1; in5 = 1; // 3 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 0; in5 = 0; // 4 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 0; in5 = 1; // 5 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 1; in5 = 0; // 6 #1 in1 = 0; in2 = 0; in3 = 1; in4 = 1; in5 = 1; // 7 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 0; in5 = 0; // 8 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 0; in5 = 1; // 9 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 1; in5 = 0; // 10 #1 in1 = 0; in2 = 1; in3 = 0; in4 = 1; in5 = 1; // 11 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 0; in5 = 0; // 12 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 0; in5 = 1; // 13 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 1; in5 = 0; // 14 #1 in1 = 0; in2 = 1; in3 = 1; in4 = 1; in5 = 1; // 15 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 0; in5 = 0; // 16 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 0; in5 = 1; // 17 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 1; in5 = 0; // 18 #1 in1 = 1; in2 = 0; in3 = 0; in4 = 1; in5 = 1; // 19 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 0; in5 = 0; // 20 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 0; in5 = 1; // 21 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 1; in5 = 0; // 22 #1 in1 = 1; in2 = 0; in3 = 1; in4 = 1; in5 = 1; // 23 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 0; in5 = 0; // 24 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 0; in5 = 1; // 25 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 1; in5 = 0; // 26 #1 in1 = 1; in2 = 1; in3 = 0; in4 = 1; in5 = 1; // 27 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 0; in5 = 0; // 28 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 0; in5 = 1; // 29 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 1; in5 = 0; // 30 #1 in1 = 1; in2 = 1; in3 = 1; in4 = 1; in5 = 1; // 31 end initial begin $monitor ("at time %0d, on input %b%b%b%b%b with pattern %b%b%b, result %b", $time, in1, in2, in3, in4, in5, pat1, pat2, pat3, out); end endmodule