diff --git a/atpg b/atpg index 3f678d4..a13cab0 100755 Binary files a/atpg and b/atpg differ diff --git a/circuit.cpp b/circuit.cpp index 9b8f3ea..d638a0d 100644 --- a/circuit.cpp +++ b/circuit.cpp @@ -35,6 +35,28 @@ void Circuit::init_stems() { } //printf("pre: %s %d\n", g->name.c_str(), g->pre_stems.size()); } + + + for(Gate *g : gates) { + if(g->isPO) continue; + std::queue q; + std::unordered_map used; + q.push(g); + + while(!q.empty()) { + Gate* now = q.front(); + q.pop(); + for(Gate* out : now->outputs) { + if(out->stem) { + g->suc_stems.push_back(out); + } else if(!used[out]) { + used[out] = true; + q.push(out); + } + } + } + //printf("pre: %s %d\n", g->name.c_str(), g->pre_stems.size()); + } } @@ -77,30 +99,36 @@ void Circuit::print_gates() { bool Circuit::is_valid_circuit() { - ll flip_total_weight = 0; ll stem_total_weight = 0; ll fault_total_weight = 0; - //printf("flip: %d, stem: %d, fault:%d\n", flip_total_weight, stem_total_weight, fault_total_weight); + int flip_total_cnt = 0; + int stem_total_cnt = 0; + int fault_total_cnt = 0; + //printf("flip: %d, stem: %d, fault:%d\n", flip_total_weight, stem_total_weight, fault_total_weight); for(Gate* g : gates) { if(flip_need_update[g->id]) { flip_total_weight += flip_weight[g->id]; + flip_total_cnt++; } - if(g->stem) { - stem_total_weight += (g->cal_value() == g->value); + if(g->stem && g->cal_value() == g->value) { + stem_total_weight += stem_weight[g->id]; + stem_total_cnt++; } if(g->sa[0]) { fault_total_weight += fault_weight[g->id][0]; + fault_total_cnt++; } if(g->sa[1]) { fault_total_weight += fault_weight[g->id][1]; + fault_total_cnt++; } // 检查门的赋值情况 @@ -148,5 +176,11 @@ bool Circuit::is_valid_circuit() { printf("[right] flip: %d, stem: %d, fault:%d\n", flip_total_weight, stem_total_weight, fault_total_weight); } + if(this->flip_total_cnt != flip_total_cnt || this->stem_total_cnt != stem_total_cnt || this->fault_total_cnt != fault_total_cnt) { + printf("CIRCUIT CHECK FAILED!\n"); + printf("[wrong] flip_cnt: %d, stem_cnt: %d, fault_cnt:%d\n", this->flip_total_cnt, this->stem_total_cnt, this->fault_total_cnt); + printf("[right] flip_cnt: %d, stem_cnt: %d, fault_cnt:%d\n", flip_total_cnt, stem_total_cnt, fault_total_weight); + } + return true; } \ No newline at end of file diff --git a/circuit.h b/circuit.h index 03a8c10..fca086e 100644 --- a/circuit.h +++ b/circuit.h @@ -21,6 +21,7 @@ public: std::unordered_map> sa_by_out; std::vector pre_stems; + std::vector suc_stems; std::vector block; @@ -63,27 +64,45 @@ void init_stems(); std::vector local_search(const std::vector &faults); // incremental flip struct + +const double SP = 0.05; + +const int FLIP_INC = 1; +const int FLIP_WEIGHT_MAX = 1e9; + +int* CC; + ll flip_total_weight; +int flip_total_cnt; int* flip_weight; int* flip_need_update; std::vector flip_update_queue; // incremental stem struct +const int STEM_INC = 10; +const int STEM_WEIGHT_MAX = 1e9; ll stem_total_weight; +int stem_total_cnt; int* stem_weight; int* stem_satisfied; +const int FAULT_INC = 1; +const int FAULT_WEIGHT_MAX = 100; ll fault_total_weight; +int fault_total_cnt; int** fault_weight; int** fault_detected; void ls_init_circuit(); void ls_init_weight(const std::vector &faults); +void ls_update_weight(); void ls_init_data_structs(); void ls_block_recal(Gate* stem); void ls_flip(Gate* stem); void ls_update(Gate* stem); -int ls_score(Gate* stem); +ll ls_pick_score(Gate* stem); + +ll ls_score(); }; \ No newline at end of file diff --git a/ls.cpp b/ls.cpp index 9fdab6d..ff1d4ad 100644 --- a/ls.cpp +++ b/ls.cpp @@ -2,12 +2,13 @@ #include #include +#include #include #include "assert.h" std::vector Circuit::local_search(const std::vector &faults) { - // 初始化并清零所有 ls 数据结构 + // 初始化并重置所有 ls 数据结构 ls_init_data_structs(); // 赋值初始权重 @@ -18,18 +19,182 @@ std::vector Circuit::local_search(const std::vector &faults) { printf("local search!\n"); - //ls_flip(PIs[0]); + while(true) { + + if(stem_total_cnt == stems.size() && flip_total_cnt == 0) { + printf("FIND SOLUTION!\n"); + printf("[SOL] flip: %lld, stem: %lld, fault:%lld. flip_cnt: %lld, stem_cnt: %lld, fault_cnt:%lld\n", flip_total_weight, stem_total_weight, fault_total_weight, flip_total_cnt, stem_total_cnt, fault_total_cnt); + break; + } + + Gate* stem = nullptr; + ll max_score = 0; + + std::vector stems_random; + std::vector candidates; + + for(int i=0; iid]) { + stems_random.push_back(stems[i]); + } + } + for(int i=0; i max_score) { + max_score = t_score; + stem = t_stem; + } + if(t_score > 0) t++; + if(t >= T) break; + } + + if(max_score > 0) { + printf("FLIP: %s\n", stem->name.c_str()); + printf("[LS] flip: %lld, stem: %lld, fault:%lld. flip_cnt: %lld, stem_cnt: %lld, fault_cnt:%lld\n", flip_total_weight, stem_total_weight, fault_total_weight, flip_total_cnt, stem_total_cnt, fault_total_cnt); + ls_flip(stem); + + CC[stem->id] = 0; + + for(Gate* pre : stem->pre_stems) { + CC[pre->id] = 1; + } + + for(Gate* suc : stem->suc_stems) { + CC[suc->id] = 1; + } + + } else { + ls_update_weight(); + + while(!flip_update_queue.empty()) { + Gate* g = flip_update_queue.back(); + flip_update_queue.pop_back(); + if(!flip_need_update[g->id]) continue; + flip_need_update[g->id] = false; + flip_total_weight -= flip_weight[g->id]; + flip_total_cnt -= 1; + ls_update(g); + } + + std::queue q; + std::unordered_map used; + for(Gate* pi : PIs) { + used[pi] = true; + q.push(pi); + } + + // while(!q.empty()) { + + // } + + // assert(flip_total_cnt == 0); + + std::vector candidates; + for(Gate *g : stems) { + if(g->isPO) continue; + if(stem_satisfied[g->id]) continue; + candidates.push_back(g); + } + + if(candidates.size() == 0) { + candidates.push_back(stems[rand()%stems.size()]); + } + + Gate* pick = candidates[rand()%candidates.size()]; + + ls_flip(pick); + + CC[pick->id] = 0; + + for(Gate* pre : pick->pre_stems) { + CC[pre->id] = 1; + } + + for(Gate* suc : pick->suc_stems) { + CC[suc->id] = 1; + } + + printf("[UP] flip: %lld, stem: %lld, fault:%lld. flip_cnt: %lld, stem_cnt: %lld, fault_cnt:%lld\n", flip_total_weight, stem_total_weight, fault_total_weight, flip_total_cnt, stem_total_cnt, fault_total_cnt); + } + } + + while(!flip_update_queue.empty()) { + Gate* g = flip_update_queue.back(); + flip_update_queue.pop_back(); + if(!flip_need_update[g->id]) continue; + flip_need_update[g->id] = false; + flip_total_weight -= flip_weight[g->id]; + flip_total_cnt -= 1; + ls_update(g); + } //print_gates(); return std::vector(); } +void Circuit::ls_update_weight() { + if(rand() % 10 < 3) { + + for(Gate* g : gates) { + + if(g->stem && stem_satisfied[g->id] && (stem_weight[g->id] - STEM_INC > 1)) { + stem_weight[g->id] -= STEM_INC; + stem_total_weight -= STEM_INC; + + for(Gate* suc : g->suc_stems) { + if(!stem_satisfied[suc->id]) { + stem_weight[suc->id] += STEM_INC; + } + } + //stem_total_weight += STEM_INC; + } + } + + } else { + for(Gate* g : gates) { + if(flip_need_update[g->id] && (flip_weight[g->id] + FLIP_INC < FLIP_WEIGHT_MAX)) { + flip_weight[g->id] += FLIP_INC; + flip_total_weight += FLIP_INC; + } + + if(g->stem && !stem_satisfied[g->id] && (stem_weight[g->id] + STEM_INC < STEM_WEIGHT_MAX)) { + stem_weight[g->id] += STEM_INC; + + for(Gate* suc : g->suc_stems) { + if(stem_weight[suc->id] - STEM_INC > 1) { + stem_weight[suc->id] -= STEM_INC; + if(stem_satisfied[suc->id]) { + stem_total_weight -= STEM_INC; + } + } + } + } + + if(!g->sa[0] && fault_weight[g->id][0] > 0 && (fault_weight[g->id][0] + FAULT_INC < FAULT_WEIGHT_MAX)) { + fault_weight[g->id][0] += FAULT_INC; + } + + if(!g->sa[1] && fault_weight[g->id][1] > 0 && (fault_weight[g->id][1] + FAULT_INC < FAULT_WEIGHT_MAX)) { + fault_weight[g->id][1] += FAULT_INC; + } + } + } +} + + bool cmp(Gate* a, Gate *b) { return a->id > b->id; } - void Circuit::ls_flip(Gate* stem) { stem->value = !stem->value; ls_block_recal(stem); @@ -37,14 +202,21 @@ void Circuit::ls_flip(Gate* stem) { void Circuit::ls_update(Gate* stem) { ls_block_recal(stem); } -int Circuit::ls_score(Gate* stem) { - - ls_flip(stem); - - int score = -flip_total_weight + stem_total_weight + fault_total_weight; +ll Circuit::ls_pick_score(Gate* stem) { ls_flip(stem); + ll new_score = ls_score(); + + ls_flip(stem); + + ll old_score = ls_score(); + + return new_score - old_score; +} + +ll Circuit::ls_score() { + ll score = - flip_total_weight + stem_total_weight + fault_total_weight; return score; } @@ -53,16 +225,19 @@ void Circuit::ls_block_recal(Gate* stem) { if(flip_need_update[stem->id]) { flip_need_update[stem->id] = false; flip_total_weight -= flip_weight[stem->id]; + flip_total_cnt -= 1; } if(stem->cal_value() == stem->value && !stem_satisfied[stem->id]){ stem_satisfied[stem->id] = true; stem_total_weight += stem_weight[stem->id]; + stem_total_cnt += 1; } if(stem->cal_value() != stem->value && stem_satisfied[stem->id]) { stem_satisfied[stem->id] = false; stem_total_weight -= stem_weight[stem->id]; + stem_total_cnt -= 1; } //printf("flip: %s\n", stem->name.c_str()); @@ -73,11 +248,13 @@ void Circuit::ls_block_recal(Gate* stem) { if(stem->sa[!stem->value] == false) { fault_total_weight += fault_weight[stem->id][!stem->value]; + fault_total_cnt += 1; stem->sa[!stem->value] = true; } if(stem->sa[stem->value] == true) { fault_total_weight -= fault_weight[stem->id][stem->value]; + fault_total_cnt -= 1; stem->sa[stem->value] = false; } } @@ -86,6 +263,8 @@ void Circuit::ls_block_recal(Gate* stem) { std::unordered_map used; std::vector suc_stems; + //printf("suc: %d %d\n", suc_stems.size(), stem->suc_stems.size()); + q.push(stem); while(!q.empty()) { @@ -105,6 +284,10 @@ void Circuit::ls_block_recal(Gate* stem) { } } + // sort(suc_stems.begin(), suc_stems.end(), cmp); + // sort(stem->suc_stems.begin(), stem->suc_stems.end(), cmp); + // assert(suc_stems == stem->suc_stems); + assert(q.empty()); used.clear(); @@ -114,11 +297,13 @@ void Circuit::ls_block_recal(Gate* stem) { if(stem->cal_value() == stem->value && !stem_satisfied[stem->id]){ stem_satisfied[stem->id] = true; stem_total_weight += stem_weight[stem->id]; + stem_total_cnt += 1; } if(stem->cal_value() != stem->value && stem_satisfied[stem->id]) { stem_satisfied[stem->id] = false; stem_total_weight -= stem_weight[stem->id]; + stem_total_cnt -= 1; } } @@ -155,35 +340,34 @@ void Circuit::ls_block_recal(Gate* stem) { if(in->stem && !in->isPI && (in->sa[0] != old_sa[0] || in->sa[1] != old_sa[1])) { - bool exist = false; for(Gate* pre : in->pre_stems) { - if(flip_need_update[pre->id]) { - exist = true; - } - } + if(flip_need_update[pre->id]) continue; - if(!exist) { - Gate* pre = in->pre_stems[0]; flip_need_update[pre->id] = true; flip_update_queue.push_back(pre); flip_total_weight += flip_weight[pre->id]; + flip_total_cnt += 1; } } if(old_sa[0] != in->sa[0]) { if(in->sa[0]) { fault_total_weight += fault_weight[in->id][0]; + fault_total_cnt += 1; } else { fault_total_weight -= fault_weight[in->id][0]; + fault_total_cnt -= 1; } } if(old_sa[1] != in->sa[1]) { if(in->sa[1]) { fault_total_weight += fault_weight[in->id][1]; + fault_total_cnt += 1; } else { fault_total_weight -= fault_weight[in->id][1]; + fault_total_cnt -= 1; } } @@ -221,13 +405,16 @@ void Circuit::ls_init_circuit() { for(int i=stems.size()-1; i>=0; i--) { ls_update(stems[i]); } - + + //printf("flip: %lld, stem: %lld, fault:%lld\n", flip_total_weight, stem_total_weight, fault_total_weight); + while(!flip_update_queue.empty()) { Gate* g = flip_update_queue.back(); flip_update_queue.pop_back(); if(!flip_need_update[g->id]) continue; flip_need_update[g->id] = false; flip_total_weight -= flip_weight[g->id]; + flip_total_cnt -= 1; ls_update(g); } } @@ -236,6 +423,9 @@ void Circuit::ls_init_data_structs() { const int MAX_LEN = gates.size() + 1; if(flip_weight == nullptr) { + CC = new int[MAX_LEN]; + + flip_weight = new int[MAX_LEN]; flip_need_update = new int[MAX_LEN]; @@ -251,19 +441,26 @@ void Circuit::ls_init_data_structs() { fault_detected[i] = new int[2]; } - } else { - flip_total_weight = 0; - stem_total_weight = 0; - fault_total_weight = 0; - for(int i=0; iis_valid_circuit()); + printf("[final] flip: %d, stem: %d, fault:%d\n", circuit->flip_total_weight, circuit->stem_total_weight, circuit->fault_total_weight); + return 0; } \ No newline at end of file diff --git a/output.txt b/output.txt index 225c7d9..2a6f1fc 100644 --- a/output.txt +++ b/output.txt @@ -1,211 +1,2 @@ -set -e; rm -f ls.d; g++ -MM -O3 -std=c++17 ls.cpp > ls.d.$$; sed 's,\(ls\)\.o[ :]*,\1.o ls.d : ,g' < ls.d.$$ > ls.d; rm -f ls.d.$$ -g++ -O3 -std=c++17 -c ls.cpp -o ls.o -g++ -O3 -std=c++17 circuit.o parser.o ls.o gate.o main.o -o atpg -======================== -parsing file c432.bench ... Done. -====== Circuit Statistics ====== -PI: 36 -PO: 7 -Gate: 196 -Stem: 96 -================================ -local search! -Gate: 1 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 4 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 8 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 11 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 14 (t: IN v:1 pi:1 po:0 s:1 p:1 s0:1 s1:0) Inputs: -Gate: 17 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 21 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 24 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 27 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 30 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 34 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 37 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 40 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 43 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 47 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 50 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 53 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 56 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 60 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 63 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 66 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 69 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 73 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 76 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 79 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 82 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 86 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 89 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 92 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 95 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 99 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 102 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 105 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 108 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 112 (t: IN v:0 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 115 (t: IN v:1 pi:1 po:0 s:1 p:0 s0:0 s1:0) Inputs: -Gate: 118 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 1 -Gate: 119 (t: NOT v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 4 -Gate: 122 (t: NOT v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 11 -Gate: 123 (t: NOT v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 17 -Gate: 126 (t: NOT v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 24 -Gate: 127 (t: NOT v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 30 -Gate: 130 (t: NOT v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 37 -Gate: 131 (t: NOT v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 43 -Gate: 134 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 50 -Gate: 135 (t: NOT v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 56 -Gate: 138 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 63 -Gate: 139 (t: NOT v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 69 -Gate: 142 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 76 -Gate: 143 (t: NOT v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 82 -Gate: 146 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 89 -Gate: 147 (t: NOT v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 95 -Gate: 150 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 102 -Gate: 151 (t: NOT v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 108 -Gate: 154 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 118 4 -Gate: 157 (t: NOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 8 119 -Gate: 158 (t: NOR v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 14 119 -Gate: 159 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 122 17 -Gate: 162 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 126 30 -Gate: 165 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 130 43 -Gate: 168 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 134 56 -Gate: 171 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 138 69 -Gate: 174 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 142 82 -Gate: 177 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 146 95 -Gate: 180 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 150 108 -Gate: 183 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 21 123 -Gate: 184 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 27 123 -Gate: 185 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 34 127 -Gate: 186 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 40 127 -Gate: 187 (t: NOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 47 131 -Gate: 188 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 53 131 -Gate: 189 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 60 135 -Gate: 190 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 66 135 -Gate: 191 (t: NOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 73 139 -Gate: 192 (t: NOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 79 139 -Gate: 193 (t: NOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 86 143 -Gate: 194 (t: NOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 92 143 -Gate: 195 (t: NOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 99 147 -Gate: 196 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 105 147 -Gate: 197 (t: NOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 112 151 -Gate: 198 (t: NOR v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 115 151 -Gate: 199 (t: AND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 154 159 162 165 168 171 174 177 180 -Gate: 203 (t: NOT v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 199 -Gate: 213 (t: NOT v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 199 -Gate: 223 (t: NOT v:0 pi:0 po:1 s:1 p:1 s0:0 s1:1) Inputs: 199 -Gate: 224 (t: XOR v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 154 -Gate: 227 (t: XOR v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 159 -Gate: 230 (t: XOR v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 162 -Gate: 233 (t: XOR v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 165 -Gate: 236 (t: XOR v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 168 -Gate: 239 (t: XOR v:0 pi:0 po:0 s:1 p:1 s0:0 s1:1) Inputs: 203 171 -Gate: 242 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 1 213 -Gate: 243 (t: XOR v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 174 -Gate: 246 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 11 -Gate: 247 (t: XOR v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 177 -Gate: 250 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 24 -Gate: 251 (t: XOR v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 203 180 -Gate: 254 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 37 -Gate: 255 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 50 -Gate: 256 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 63 -Gate: 257 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 76 -Gate: 258 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 89 -Gate: 259 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 213 102 -Gate: 260 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 224 157 -Gate: 263 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 224 158 -Gate: 264 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 227 183 -Gate: 267 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 230 185 -Gate: 270 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 233 187 -Gate: 273 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 236 189 -Gate: 276 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 239 191 -Gate: 279 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 243 193 -Gate: 282 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 247 195 -Gate: 285 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 251 197 -Gate: 288 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 227 184 -Gate: 289 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 230 186 -Gate: 290 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 233 188 -Gate: 291 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 236 190 -Gate: 292 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 239 192 -Gate: 293 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 243 194 -Gate: 294 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 247 196 -Gate: 295 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 251 198 -Gate: 296 (t: AND v:0 pi:0 po:0 s:1 p:1 s0:0 s1:1) Inputs: 260 264 267 270 273 276 279 282 285 -Gate: 300 (t: NOT v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 263 -Gate: 301 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 288 -Gate: 302 (t: NOT v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 289 -Gate: 303 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 290 -Gate: 304 (t: NOT v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 291 -Gate: 305 (t: NOT v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 292 -Gate: 306 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 293 -Gate: 307 (t: NOT v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 294 -Gate: 308 (t: NOT v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 295 -Gate: 309 (t: NOT v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 296 -Gate: 319 (t: NOT v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 296 -Gate: 329 (t: NOT v:1 pi:0 po:1 s:1 p:1 s0:1 s1:0) Inputs: 296 -Gate: 330 (t: XOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 260 -Gate: 331 (t: XOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 264 -Gate: 332 (t: XOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 267 -Gate: 333 (t: XOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 270 -Gate: 334 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 8 319 -Gate: 335 (t: XOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 273 -Gate: 336 (t:NAND v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 21 -Gate: 337 (t: XOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 276 -Gate: 338 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 34 -Gate: 339 (t: XOR v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 279 -Gate: 340 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 47 -Gate: 341 (t: XOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 282 -Gate: 342 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 60 -Gate: 343 (t: XOR v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 309 285 -Gate: 344 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 73 -Gate: 345 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 86 -Gate: 346 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 99 -Gate: 347 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 319 112 -Gate: 348 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 330 300 -Gate: 349 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 331 301 -Gate: 350 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 332 302 -Gate: 351 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 333 303 -Gate: 352 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 335 304 -Gate: 353 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 337 305 -Gate: 354 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 339 306 -Gate: 355 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 341 307 -Gate: 356 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 343 308 -Gate: 357 (t: AND v:1 pi:0 po:0 s:1 p:1 s0:1 s1:0) Inputs: 348 349 350 351 352 353 354 355 356 -Gate: 360 (t: NOT v:1 pi:0 po:0 s:1 p:1 s0:1 s1:0) Inputs: 357 -Gate: 370 (t: NOT v:0 pi:0 po:1 s:1 p:1 s0:0 s1:1) Inputs: 357 -Gate: 371 (t:NAND v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 14 360 -Gate: 372 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 27 -Gate: 373 (t:NAND v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 40 -Gate: 374 (t:NAND v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 53 -Gate: 375 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 66 -Gate: 376 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 79 -Gate: 377 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 92 -Gate: 378 (t:NAND v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 105 -Gate: 379 (t:NAND v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 360 115 -Gate: 380 (t:NAND v:1 pi:0 po:0 s:0 p:1 s0:1 s1:0) Inputs: 4 242 334 371 -Gate: 381 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 246 336 372 17 -Gate: 386 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 250 338 373 30 -Gate: 393 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 254 340 374 43 -Gate: 399 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 255 342 375 56 -Gate: 404 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 256 344 376 69 -Gate: 407 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 257 345 377 82 -Gate: 411 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 258 346 378 95 -Gate: 414 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 259 347 379 108 -Gate: 415 (t: NOT v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 380 -Gate: 416 (t: AND v:0 pi:0 po:0 s:0 p:1 s0:0 s1:1) Inputs: 381 386 393 399 404 407 411 414 -Gate: 417 (t: NOT v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 393 -Gate: 418 (t: NOT v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 404 -Gate: 419 (t: NOT v:0 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 407 -Gate: 420 (t: NOT v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 411 -Gate: 421 (t: NOR v:1 pi:0 po:1 s:1 p:1 s0:1 s1:0) Inputs: 415 416 -Gate: 422 (t:NAND v:1 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 386 417 -Gate: 425 (t:NAND v:0 pi:0 po:0 s:1 p:0 s0:0 s1:0) Inputs: 386 393 418 399 -Gate: 428 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 399 393 419 -Gate: 429 (t:NAND v:1 pi:0 po:0 s:0 p:0 s0:0 s1:0) Inputs: 386 393 407 420 -Gate: 430 (t:NAND v:1 pi:0 po:1 s:1 p:1 s0:1 s1:0) Inputs: 381 386 422 399 -Gate: 431 (t:NAND v:1 pi:0 po:1 s:1 p:1 s0:1 s1:0) Inputs: 381 386 425 428 -Gate: 432 (t:NAND v:0 pi:0 po:1 s:1 p:1 s0:0 s1:1) Inputs: 381 422 425 429 -checking valid circuit ...---- 171 ----- 203 - result: 1. +set -e; rm -f ls.d; g++ -MM -O3 -std=c++17 -g ls.cpp > ls.d.$$; sed 's,\(ls\)\.o[ :]*,\1.o ls.d : ,g' < ls.d.$$ > ls.d; rm -f ls.d.$$ +g++ -O3 -std=c++17 -g -c ls.cpp -o ls.o