diff --git a/atpg b/atpg index 41737ba..788f61c 100755 Binary files a/atpg and b/atpg differ diff --git a/src/checker.cpp b/src/checker.cpp index 4e4fdd9..6c8db59 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3,12 +3,10 @@ int Circuit::check_circuit() { int sum_value_unsatisfied_cost = 0; + int sum_fault_need_update_cost = 0; int sum_fault_propagated_weight = 0; - int sum_fault_propagated_unsatisfied_cost = 0; - int sum_fault_detected_weight = 0; - int sum_fault_detected_unsatisfied_cost = 0; for(Gate* g : gates) { @@ -19,39 +17,31 @@ int Circuit::check_circuit() { assert(g->value_satisfied == ( g->cal_value() == g->value )); - assert(g->fault_detected_satisfied[0] == ( g->cal_fault_detected(0) == g->fault_detected[0] )); - assert(g->fault_detected_satisfied[1] == ( g->cal_fault_detected(1) == g->fault_detected[1] )); + int changed = 0; + if(!changed && g->cal_fault_detected(0) != g->fault_detected[0]) changed = 1; + if(!changed && g->cal_fault_detected(1) != g->fault_detected[1]) changed = 1; + if(!changed && g->cal_propagate_len(0) != g->cal_propagate_len(0)) changed = 1; + if(!changed && g->cal_propagate_len(1) != g->cal_propagate_len(1)) changed = 1; - assert(g->fault_propagated_satisfied[0] == ( g->cal_propagate_len(0) == g->fault_propagated_len[0])); - - - // if(g->fault_propagated_satisfied[1] != ( g->cal_propagate_len(1) == g->fault_propagated_len[1])) { - // printf("pl: %s\n", g->name.c_str()); - // print_gates(); - // } - assert(g->fault_propagated_satisfied[1] == ( g->cal_propagate_len(1) == g->fault_propagated_len[1])); + assert(changed == g->fault_need_update); if(!g->value_satisfied) sum_value_unsatisfied_cost += g->value_unsatisfied_cost; + if(g->fault_need_update) sum_fault_need_update_cost += g->fault_need_update_cost; if(g->fault_detected[0]) sum_fault_detected_weight += g->fault_detected_weight[0]; if(g->fault_detected[1]) sum_fault_detected_weight += g->fault_detected_weight[1]; - if(!g->fault_detected_satisfied[0]) sum_fault_detected_unsatisfied_cost += g->fault_detected_unsatisfied_cost[0]; - if(!g->fault_detected_satisfied[1]) sum_fault_detected_unsatisfied_cost += g->fault_detected_unsatisfied_cost[1]; - sum_fault_propagated_weight += g->fault_propagated_len[0] * g->fault_propagated_weight[0]; sum_fault_propagated_weight += g->fault_propagated_len[1] * g->fault_propagated_weight[1]; - - if(!g->fault_propagated_satisfied[0]) sum_fault_propagated_unsatisfied_cost += g->fault_propagated_unsatisfied_cost[0]; - if(!g->fault_propagated_satisfied[1]) sum_fault_propagated_unsatisfied_cost += g->fault_propagated_unsatisfied_cost[1]; + } int circuit_score = sum_fault_propagated_weight + sum_fault_detected_weight - - sum_fault_propagated_unsatisfied_cost - sum_fault_detected_unsatisfied_cost - sum_value_unsatisfied_cost; + - sum_value_unsatisfied_cost - sum_fault_need_update_cost; printf("svuc: %d, sfpw: %d, sfpuc: %d, sfdw: %d, sfduc: %d\n", - sum_value_unsatisfied_cost, sum_fault_propagated_weight, sum_fault_propagated_unsatisfied_cost, - sum_fault_detected_weight, sum_fault_detected_unsatisfied_cost); + sum_value_unsatisfied_cost, + sum_fault_propagated_weight, sum_fault_detected_weight); return circuit_score; } \ No newline at end of file diff --git a/src/circuit.h b/src/circuit.h index 72b618c..6d69c4a 100644 --- a/src/circuit.h +++ b/src/circuit.h @@ -31,15 +31,12 @@ public: int fault_propagated_len[2]; int fault_propagated_weight[2]; - - int fault_propagated_satisfied[2]; - int fault_propagated_unsatisfied_cost[2]; int fault_detected[2]; int fault_detected_weight[2]; - int fault_detected_satisfied[2]; - int fault_detected_unsatisfied_cost[2]; + int fault_need_update; + int fault_need_update_cost; int CC; @@ -68,12 +65,9 @@ public: int score; int score_value_unsatisfied_cost; - int score_fault_propagated_weight[2]; - int score_fault_propagated_unsatisfied_cost[2]; - int score_fault_detected_weight[2]; - int score_fault_detected_unsatisfied_cost[2]; + int score_fault_update_cost; // score calculation function @@ -83,11 +77,9 @@ public: int cal_score_fault_propagated_weight(int sa); - int cal_score_fault_propagated_unsatisfied_cost(int sa); - int cal_score_fault_detected_weight(int sa); - int cal_score_fault_detected_unsatisfied_cost(int sa); + int cal_score_fault_update_cost(); }; class Fault { diff --git a/src/gate.cpp b/src/gate.cpp index b1a0326..15bc16d 100644 --- a/src/gate.cpp +++ b/src/gate.cpp @@ -12,10 +12,6 @@ void Gate::update_gate_property() { void Gate::update_gate_statistics() { value_satisfied = ( cal_value() == value ); - fault_detected_satisfied[0] = ( cal_fault_detected(0) == fault_detected[0] ); - fault_detected_satisfied[1] = ( cal_fault_detected(1) == fault_detected[1] ); - fault_propagated_satisfied[0] = ( cal_propagate_len(0) == fault_propagated_len[0] ); - fault_propagated_satisfied[1] = ( cal_propagate_len(1) == fault_propagated_len[1] ); } int Gate::cal_propagate_len(bool x) { diff --git a/src/ls.cpp b/src/ls.cpp index 76706ae..45d19fe 100644 --- a/src/ls.cpp +++ b/src/ls.cpp @@ -113,40 +113,17 @@ void Circuit::ls_flip(Gate* gate) { int cal_cnt = 0; for(Gate* g : gate->fanouts) { - // printf("cal2: %s\n", g->name.c_str()); - t.insert(g); g->score = g->cal_score(); - cal_cnt++; - for(Gate* in : g->fanins) { - t.insert(in); - in->score = in->cal_score(); - cal_cnt++; - for(Gate *out : in->fanouts) { - t.insert(out); - out->score = out->cal_score(); - cal_cnt++; - for(Gate *in : out->fanins) { - t.insert(in); - in->score = in->cal_score(); - cal_cnt++; - } - } - } + } + + for(Gate* g : gate->reigon) { + g->score = g->cal_score(); } for(Gate* g : gate->fanins) { - t.insert(g); g->score = g->cal_score(); - cal_cnt++; for(Gate* out : g->fanouts) { - t.insert(out); out->score = out->cal_score(); - cal_cnt++; - for(Gate* in : out->fanins) { - t.insert(in); - in->score = in->cal_score(); - cal_cnt++; - } } } @@ -180,11 +157,11 @@ void Circuit::ls_init_circuit(std::unordered_set &faults) { // init value, weight and cost for(Gate* g : gates) { g->value = rand() % 2; + g->fault_need_update = 0; g->value_unsatisfied_cost = 1; + g->fault_need_update_cost = 1; g->fault_propagated_weight[0] = g->fault_propagated_weight[1] = 0; - g->fault_propagated_unsatisfied_cost[0] = g->fault_propagated_unsatisfied_cost[1] = 1; g->fault_detected_weight[0] = g->fault_detected_weight[1] = 0; - g->fault_detected_unsatisfied_cost[0] = g->fault_detected_unsatisfied_cost[1] = 1; } for(Fault* f : faults) { diff --git a/src/score.cpp b/src/score.cpp index c6389f3..019b8fb 100644 --- a/src/score.cpp +++ b/src/score.cpp @@ -5,39 +5,49 @@ int Gate::cal_score(int debug) { value ^= 1; - if(debug) { - // printf("lala: %s\n", this->name.c_str()); - assert(score_value_unsatisfied_cost == cal_value_unsatisfied_cost()); - assert(score_fault_propagated_weight[0] == cal_score_fault_propagated_weight(0)); - assert(score_fault_propagated_weight[1] == cal_score_fault_propagated_weight(1)); - assert(score_fault_propagated_unsatisfied_cost[0] == cal_score_fault_propagated_unsatisfied_cost(0)); - assert(score_fault_propagated_unsatisfied_cost[1] == cal_score_fault_propagated_unsatisfied_cost(1)); - assert(score_fault_detected_weight[0] == cal_score_fault_detected_weight(0)); - assert(score_fault_detected_weight[1] == cal_score_fault_detected_weight(1)); - assert(score_fault_detected_unsatisfied_cost[0] == cal_score_fault_detected_unsatisfied_cost(0)); - assert(score_fault_detected_unsatisfied_cost[1] == cal_score_fault_detected_unsatisfied_cost(1)); - } + // if(debug) { + // // printf("lala: %s\n", this->name.c_str()); + // assert(score_value_unsatisfied_cost == cal_value_unsatisfied_cost()); + // assert(score_fault_propagated_weight[0] == cal_score_fault_propagated_weight(0)); + // assert(score_fault_propagated_weight[1] == cal_score_fault_propagated_weight(1)); + // assert(score_fault_propagated_unsatisfied_cost[0] == cal_score_fault_propagated_unsatisfied_cost(0)); + // assert(score_fault_propagated_unsatisfied_cost[1] == cal_score_fault_propagated_unsatisfied_cost(1)); + // assert(score_fault_detected_weight[0] == cal_score_fault_detected_weight(0)); + // assert(score_fault_detected_weight[1] == cal_score_fault_detected_weight(1)); + // assert(score_fault_detected_unsatisfied_cost[0] == cal_score_fault_detected_unsatisfied_cost(0)); + // assert(score_fault_detected_unsatisfied_cost[1] == cal_score_fault_detected_unsatisfied_cost(1)); + // } + + int origin_fault_detected[2]; + origin_fault_detected[0] = this->fault_detected[0]; + origin_fault_detected[1] = this->fault_detected[1]; + this->fault_detected[0] = this->cal_fault_detected(0); + this->fault_detected[1] = this->cal_fault_detected(1); + + int origin_fault_propagated_len[2]; + origin_fault_propagated_len[0] = this->fault_propagated_len[0]; + origin_fault_propagated_len[1] = this->fault_propagated_len[1]; + this->fault_propagated_len[0] = this->cal_propagate_len(0); + this->fault_propagated_len[1] = this->cal_propagate_len(1); score_value_unsatisfied_cost = cal_value_unsatisfied_cost(); score_fault_propagated_weight[0] = cal_score_fault_propagated_weight(0); score_fault_propagated_weight[1] = cal_score_fault_propagated_weight(1); - score_fault_propagated_unsatisfied_cost[0] = cal_score_fault_propagated_unsatisfied_cost(0); - score_fault_propagated_unsatisfied_cost[1] = cal_score_fault_propagated_unsatisfied_cost(1); - score_fault_detected_weight[0] = cal_score_fault_detected_weight(0); score_fault_detected_weight[1] = cal_score_fault_detected_weight(1); - score_fault_detected_unsatisfied_cost[0] = cal_score_fault_detected_unsatisfied_cost(0); - score_fault_detected_unsatisfied_cost[1] = cal_score_fault_detected_unsatisfied_cost(1); + score_fault_update_cost = cal_score_fault_update_cost(); value ^= 1; + this->fault_propagated_len[0] = origin_fault_propagated_len[0]; + this->fault_propagated_len[1] = origin_fault_propagated_len[1]; + this->fault_detected[0] = origin_fault_detected[0]; + this->fault_detected[1] = origin_fault_detected[1]; - return - score_value_unsatisfied_cost + return - score_value_unsatisfied_cost - score_fault_update_cost + score_fault_propagated_weight[0] + score_fault_propagated_weight[1] - - score_fault_propagated_unsatisfied_cost[0] - score_fault_propagated_unsatisfied_cost[1] - + score_fault_detected_weight[0] + score_fault_detected_weight[1] - - score_fault_detected_unsatisfied_cost[0] - score_fault_detected_unsatisfied_cost[1]; + + score_fault_detected_weight[0] + score_fault_detected_weight[1]; } int Gate::cal_value_unsatisfied_cost() { @@ -65,62 +75,31 @@ int Gate::cal_score_fault_propagated_weight(int sa) { return res; } -int Gate::cal_score_fault_propagated_unsatisfied_cost(int sa) { - int res = 0; - int origin_fault_propagated_len[2]; - origin_fault_propagated_len[0] = this->fault_propagated_len[0]; - origin_fault_propagated_len[1] = this->fault_propagated_len[1]; - this->fault_propagated_len[0] = this->cal_propagate_len(0); - this->fault_propagated_len[1] = this->cal_propagate_len(1); - - if(!this->fault_propagated_satisfied[sa]) { - res -= this->fault_propagated_unsatisfied_cost[sa]; - } - - for(Gate* g : this->reigon) { - if(g->fault_propagated_satisfied[sa] && g->cal_propagate_len(sa) != g->fault_propagated_len[sa]) { - res += g->fault_propagated_unsatisfied_cost[sa]; - } - if(!g->fault_propagated_satisfied[sa] && g->cal_propagate_len(sa) == g->fault_propagated_len[sa]) { - res -= g->fault_propagated_unsatisfied_cost[sa]; - } - } - - this->fault_propagated_len[0] = origin_fault_propagated_len[0]; - this->fault_propagated_len[1] = origin_fault_propagated_len[1]; - return res; -} - int Gate::cal_score_fault_detected_weight(int sa) { int res = 0; res += ( this->cal_fault_detected(sa) - this->fault_detected[sa] ) * this->fault_detected_weight[sa]; return res; } -int Gate::cal_score_fault_detected_unsatisfied_cost(int sa) { +int Gate::cal_score_fault_update_cost() { int res = 0; - int origin_fault_detected[2]; - origin_fault_detected[0] = this->fault_detected[0]; - origin_fault_detected[1] = this->fault_detected[1]; - this->fault_detected[0] = this->cal_fault_detected(0); - this->fault_detected[1] = this->cal_fault_detected(1); - - if(!fault_detected_satisfied[sa]) { - res -= this->fault_detected_unsatisfied_cost[sa]; + if(this->fault_need_update) { + res -= this->fault_need_update_cost; } - for(Gate* g : this->reigon) { - if(g->fault_detected_satisfied[sa] && g->cal_fault_detected(sa) != g->fault_detected[sa]) { - res += g->fault_detected_unsatisfied_cost[sa]; - } - if(!g->fault_detected_satisfied[sa] && g->cal_fault_detected(sa) == g->fault_detected[sa]) { - res -= g->fault_detected_unsatisfied_cost[sa]; + for(Gate* g : fanins) { + bool changed = 0; + if(!changed && g->cal_fault_detected(0) != g->fault_detected[0]) changed = 1; + if(!changed && g->cal_fault_detected(1) != g->fault_detected[1]) changed = 1; + if(!changed && g->cal_propagate_len(0) != g->cal_propagate_len(0)) changed = 1; + if(!changed && g->cal_propagate_len(1) != g->cal_propagate_len(1)) changed = 1; + + if(!g->fault_need_update && changed) { + res += g->fault_need_update_cost; } } - this->fault_detected[0] = origin_fault_detected[0]; - this->fault_detected[1] = origin_fault_detected[1]; - return res; + } \ No newline at end of file