更新一部分 ls 代码
This commit is contained in:
parent
d3b23cbfb4
commit
d613341d1c
53
circuit.cpp
53
circuit.cpp
@ -27,4 +27,57 @@ void Circuit::cal_topo_index() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Circuit::cal_gate_value(const Gate* &gate) {
|
||||||
|
int res;
|
||||||
|
|
||||||
|
switch(gate->type) {
|
||||||
|
case Gate::NOT:
|
||||||
|
res = !gate->inputs[0]->value;
|
||||||
|
break;
|
||||||
|
case Gate::BUF:
|
||||||
|
res = gate->inputs[0]->value;
|
||||||
|
break;
|
||||||
|
case Gate::AND:
|
||||||
|
res = gate->inputs[0]->value;
|
||||||
|
for(int i=1; i<gate->inputs.size(); i++) {
|
||||||
|
res &= gate->inputs[i]->value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Gate::NAND:
|
||||||
|
res = gate->inputs[0]->value;
|
||||||
|
for(int i=1; i<gate->inputs.size(); i++) {
|
||||||
|
res &= gate->inputs[i]->value;
|
||||||
|
}
|
||||||
|
res = !res;
|
||||||
|
break;
|
||||||
|
case Gate::OR:
|
||||||
|
res = gate->inputs[0]->value;
|
||||||
|
for(int i=1; i<gate->inputs.size(); i++) {
|
||||||
|
res |= gate->inputs[i]->value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Gate::NOR:
|
||||||
|
res = gate->inputs[0]->value;
|
||||||
|
for(int i=1; i<gate->inputs.size(); i++) {
|
||||||
|
res |= gate->inputs[i]->value;
|
||||||
|
}
|
||||||
|
res = !res;
|
||||||
|
break;
|
||||||
|
case Gate::XOR:
|
||||||
|
res = gate->inputs[0]->value;
|
||||||
|
for(int i=1; i<gate->inputs.size(); i++) {
|
||||||
|
res ^= gate->inputs[i]->value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Gate::XNOR:
|
||||||
|
res = gate->inputs[0]->value;
|
||||||
|
for(int i=1; i<gate->inputs.size(); i++) {
|
||||||
|
res ^= gate->inputs[i]->value;
|
||||||
|
}
|
||||||
|
res = !res;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
@ -6,8 +8,8 @@ class Gate {
|
|||||||
public:
|
public:
|
||||||
int topo;
|
int topo;
|
||||||
std::string name;
|
std::string name;
|
||||||
enum { AND, NAND, OR, NOR, XOR, XNOR, NOT, BUF, INPUT, OUTPUT } type;
|
enum Type { AND, NAND, OR, NOR, XOR, XNOR, NOT, BUF, INPUT, OUTPUT } type;
|
||||||
enum { VAL_ZERO, VAL_ONE, VAL_X } value;
|
int value;
|
||||||
std::vector<Gate*> outputs;
|
std::vector<Gate*> outputs;
|
||||||
std::vector<Gate*> inputs;
|
std::vector<Gate*> inputs;
|
||||||
};
|
};
|
||||||
@ -19,6 +21,7 @@ std::vector<Gate*> POs;
|
|||||||
std::vector<Gate*> gates;
|
std::vector<Gate*> gates;
|
||||||
std::unordered_map<std::string, Gate*> name2gate;
|
std::unordered_map<std::string, Gate*> name2gate;
|
||||||
void parse_from_file(const char *filename);
|
void parse_from_file(const char *filename);
|
||||||
|
int cal_gate_value(const Gate* &gate);
|
||||||
void cal_topo_index();
|
void cal_topo_index();
|
||||||
void cal_headlines();
|
|
||||||
};
|
};
|
35
ls.cpp
Normal file
35
ls.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "ls.h"
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<int> local_search(Circuit* circuit) {
|
||||||
|
|
||||||
|
// local search vector
|
||||||
|
std::vector<Gate*> vec;
|
||||||
|
|
||||||
|
init_vector(circuit, &vec);
|
||||||
|
|
||||||
|
init_circuit(circuit);
|
||||||
|
|
||||||
|
printf("local search!\n");
|
||||||
|
|
||||||
|
return std::vector<int>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void init_circuit(Circuit* circuit) {
|
||||||
|
for(auto pi : circuit->PIs) {
|
||||||
|
pi->value = rand() % 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_vector(Circuit* circuit, std::vector<Gate*> *vec) {
|
||||||
|
for(auto pi : circuit->PIs) {
|
||||||
|
vec->push_back(pi);
|
||||||
|
}
|
||||||
|
for(auto gate : circuit->gates) {
|
||||||
|
// fanout stem
|
||||||
|
if(gate->outputs.size() >= 2) {
|
||||||
|
vec->push_back(gate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
9
ls.h
Normal file
9
ls.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "circuit.h"
|
||||||
|
|
||||||
|
std::vector<int> local_search(Circuit* circuit);
|
||||||
|
|
||||||
|
// private
|
||||||
|
void init_circuit(Circuit* circuit);
|
||||||
|
void init_vector(Circuit* circuit, std::vector<Gate*> *vec);
|
13
main.cpp
13
main.cpp
@ -2,8 +2,8 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
#include "circuit.h"
|
#include "circuit.h"
|
||||||
|
#include "ls.h"
|
||||||
|
|
||||||
int main(int args, char* argv[]) {
|
int main(int args, char* argv[]) {
|
||||||
|
|
||||||
@ -21,11 +21,22 @@ int main(int args, char* argv[]) {
|
|||||||
printf("PO:\t%ld\n", circuit.POs.size());
|
printf("PO:\t%ld\n", circuit.POs.size());
|
||||||
printf("Gates:\t%ld\n", circuit.name2gate.size());
|
printf("Gates:\t%ld\n", circuit.name2gate.size());
|
||||||
|
|
||||||
|
int cnt = 0;
|
||||||
|
for(auto& gate: circuit.gates) {
|
||||||
|
if(gate->outputs.size() > 2) {
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Stem:\t%d\n", cnt);
|
||||||
|
|
||||||
printf("cal topo index ...\n");
|
printf("cal topo index ...\n");
|
||||||
circuit.cal_topo_index();
|
circuit.cal_topo_index();
|
||||||
for(Gate* gate : circuit.gates) {
|
for(Gate* gate : circuit.gates) {
|
||||||
assert(gate->topo > 0);
|
assert(gate->topo > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
srand(19260817);
|
||||||
|
local_search(&circuit);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
@ -73,7 +73,6 @@ void Circuit::parse_from_file(const char *filename) {
|
|||||||
|
|
||||||
Gate* gate = new Gate();
|
Gate* gate = new Gate();
|
||||||
gate->name = tokens[0];
|
gate->name = tokens[0];
|
||||||
gate->value = Gate::VAL_X;
|
|
||||||
|
|
||||||
for(auto &in : ins) {
|
for(auto &in : ins) {
|
||||||
if(!name2gate.count(in)) {
|
if(!name2gate.count(in)) {
|
||||||
@ -109,10 +108,9 @@ void Circuit::parse_from_file(const char *filename) {
|
|||||||
Gate* gate = new Gate();
|
Gate* gate = new Gate();
|
||||||
gate->name = tokens[2];
|
gate->name = tokens[2];
|
||||||
gate->type = Gate::INPUT;
|
gate->type = Gate::INPUT;
|
||||||
gate->value = Gate::VAL_X;
|
|
||||||
|
|
||||||
name2gate.insert(std::make_pair(gate->name, gate));
|
name2gate.insert(std::make_pair(gate->name, gate));
|
||||||
gates.push_back(gate);
|
// gates.push_back(gate);
|
||||||
PIs.push_back(gate);
|
PIs.push_back(gate);
|
||||||
}
|
}
|
||||||
// gate
|
// gate
|
||||||
|
Loading…
x
Reference in New Issue
Block a user