/*--------------------------------------------------------- * * Multi-fault Fault Simulator (Uniprocessor) * */ #include #include #include #include"fault.h" typedef unsigned char boolean; int failureNumber; /* generic one output gate */ /* with initialization to 0 and provision for stuck at faults */ class gate { private: int serialNumber; public: boolean output; static int nextSerial; gate() { output = 0; serialNumber = nextSerial++; } boolean &update(const boolean &newval) { output = newval && ((failureNumber >> serialNumber) & 1); return (output); } }; /* two input nand gate */ class nand2:public gate { public: boolean &e(const boolean &in1, const boolean &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 */ boolean &net(boolean in1, boolean in2, boolean in3, boolean in4, boolean in5, boolean in6, boolean in7, boolean in8, boolean 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() { boolean passed = 1; boolean thisFaultDetected[testCases]; boolean answer1, answer2, answer3; assert(testCases == 1 << gate::nextSerial); thisFaultDetected[testCases] = 1; failureNumber = testCases - 1; // look at fault-free case answer1 = net(1, 0, 1, 0, 1, 0, 1, 0, 1); answer2 = net(0, 1, 0, 1, 0, 1, 0, 1, 0); answer3 = net(1, 0, 1, 0, 1, 1, 1, 0, 1); for (failureNumber = 0; failureNumber < testCases - 1; failureNumber++) { thisFaultDetected[failureNumber] = 1; // skip remainder of simulation if fault detected on output if (answer1 != net(1, 0, 1, 0, 1, 0, 1, 0, 1)) continue; if (answer2 != net(0, 1, 0, 1, 0, 1, 0, 1, 0)) continue; if (answer3 != net(1, 0, 1, 0, 1, 1, 1, 0, 1)) continue; thisFaultDetected[failureNumber] = 0; passed = 0; } return (passed); }