/*--------------------------------------------------------- * * Multi-fault Fault Simulator (C-RAM) * */ #include #include"fault.h" /* generic one output gate */ /* with initialization to 0 and provision for stuck at faults */ class gate { private: int serialNumber; public: cboolean output; static int nextSerial; gate() { output.zero(); serialNumber = nextSerial++; } cboolean &update(const cboolean &newval) { output = newval && PEid.extractBit(serialNumber); return (output); } }; /* two input nand gate */ class nand2:public gate { public: cboolean &e(const cboolean &in1, const cboolean &in2) { return update(!(in1 && in2)); } }; int gate::nextSerial = 0; nand2 s, r, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15; /* a self-evaluating netlist */ cboolean &net(cboolean in1, cboolean in2, cboolean in3, cboolean in4, cboolean in5, cboolean in6, cboolean in7, cboolean in8, cboolean reset) { // tree of combinational logic followed by an RS flipflop (void) g15.e( g13.e(g9.e(g1.e(in1, in2), g2.e(in3, in4)), g10.e(g3.e(in5, in6), g4.e(in7, in8))), g14.e(g11.e(g5.e(in1, in2), g6.e(in3, in4)), g12.e(g7.e(in5, in6), g8.e(in7, in8)))); (void) r.e(s.e(g15.output, r.output), reset); return (r.e(s.e(g15.output, r.output), reset)); } /* Determine if the test vector detects all faults */ boolean faultSim() { cboolean passed; cboolean answer1, answer2, answer3; cboolean result1, result2, result3; cboolean correctAnswer; cboolean k0, k1; // constants cuint lastTestCaseNumber(20, UNALIGNED); /* identify the PE simulating no faults */ lastTestCaseNumber = 1 << gate::nextSerial - 1; correctAnswer = PEid == lastTestCaseNumber; k0.zero(); k1 = !k0; result1 = net(k1, k0, k1, k0, k1, k0, k1, k0, k1); result2 = net(k0, k1, k0, k1, k0, k1, k0, k1, k0); result3 = net(k1, k0, k1, k0, k1, k1, k1, k0, k1); answer1.broadcast(correctAnswer, result1); answer2.broadcast(correctAnswer, result2); answer3.broadcast(correctAnswer, result3); passed = (result1 != answer1) || (result2 != answer2) || (result3 != answer3); /* the PE holding the correct answer will never successfully */ /* detect a fault, so ignore it */ passed = passed || correctAnswer; return (candScalar(passed)); }