Commit 7889538b by chengshuyao

Add vector mode for AIGs

parent 6751fa64
......@@ -32,7 +32,7 @@ using namespace std;
//电路的parameter Circuit_parameter
int circuit_index = 9999; //电路编号
extern const int parameter_max_orders = 8;
extern const int parameter_max_orders = 8;
......
......@@ -74,7 +74,9 @@ public:
bool ** simplify_list ;
bool cal_infer_result(bool input_data[parameter_input_bit_width],int which_root_node,bool neg);
bool* io_generator(bool input_data[parameter_input_bit_width],bool* output_data);
int* io_generator_vec(int input_data[parameter_input_bit_width],int* output_data);
bool io_generator_single(bool input_data[parameter_input_bit_width],int which_bit_output);
int io_generator_single_vec(int input_data[parameter_input_bit_width],int which_bit_output);
int set_random_input_data(bool** mask_input_data);
int mask_random_input_data(int depth,bool mask[parameter_input_bit_width],int amount,int* most_influence,bool** mask_input_data);
int next_bit_layer(int depth,int order_num);
......@@ -197,7 +199,15 @@ int BDD_class::BSD_samples_sort_each_layer(){
bool* BDD_class::io_generator(bool input_data[parameter_input_bit_width],bool* output_bits){
//bool* output_bits = new bool [parameter_output_bit_width];
output_bits = io_generator_function(input_data,which_demo_function,output_bits);
output_bits = io_generator_function(input_data,output_bits);
//io_read_times += 1;
return output_bits;
};
int* BDD_class::io_generator_vec(int input_data[parameter_input_bit_width],int* output_bits){
//bool* output_bits = new bool [parameter_output_bit_width];
//cout<<"Debug 4"<<endl;
output_bits = io_generator_function_vec(input_data,output_bits);
//cout<<"Debug 5"<<endl;
//io_read_times += 1;
return output_bits;
};
......@@ -206,12 +216,26 @@ bool BDD_class::io_generator_single(bool input_data[parameter_input_bit_width],i
bool output_bit;
bool* output_bits = new bool [100];
output_bits = io_generator(input_data,output_bits);
output_bits = io_generator_function(input_data,output_bits);
output_bit = output_bits[which_bit_output] ;
delete [] output_bits;
return output_bit;
};
int BDD_class::io_generator_single_vec(int input_data[parameter_input_bit_width],int which_bit_output){
//cout<<"Debug 3"<<endl;
int output_bit;
//cout<<"Debug 3"<<endl;
int* output_bits = new int [100];
//cout<<"Debug 3"<<endl;
output_bits = io_generator_function_vec(input_data,output_bits);
output_bit = output_bits[which_bit_output] ;
//cout<<"which bit output "<<which_bit_output<<" "<<hex<<output_bit<<endl;
delete [] output_bits;
return output_bit;
};
int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int how_many_start_nodes, BDD_node* start_nodes){
int i,j;
......@@ -433,33 +457,114 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
BSD_samples = BSD_samples_sort;
most_influence[i] = next_bit_layer(i,order_num);
BSD_samples = BSD_samples_train;
BSD_samples = int(BSD_samples_train/31)*31;
cout<<BSD_samples<<endl;
cout<<"The BSD is on layer: "<<i<<" ";
cout<<"The input bit is: x"<<most_influence[i]<<endl;
cout<<"BSD width at this layer: "<<BDD_width_each_layer[i]<<endl;
set_random_input_data(mask_input_data);
// #pragma omp parallel for
// for(long zj=0;zj<BDD_width_each_layer[i]*BSD_samples;zj++){
// int j = int(zj/BSD_samples);
// int zi = int(zj%BSD_samples);
// bool mask_input_data_left [parameter_input_bit_width];
// bool mask_input_data_right[parameter_input_bit_width];
// for (int jj=0;jj<parameter_input_bit_width;jj++){
// mask_input_data_left [jj] = mask_input_data[zi][jj];
// mask_input_data_right[jj] = mask_input_data[zi][jj];
// }
// for (int jj=0;jj<i;jj++){
// mask_input_data_left [most_influence[jj]] = BDD_mask_this[j].mask[most_influence[jj]];
// mask_input_data_right[most_influence[jj]] = BDD_mask_this[j].mask[most_influence[jj]];
// }
// mask_input_data_left [most_influence[i]] = 0;
// mask_input_data_right[most_influence[i]] = 1;
// bool left_mask_output_data_b = io_generator_single(mask_input_data_left ,BDD[i][j].which_bit_output);
// bool right_mask_output_data_b = io_generator_single(mask_input_data_right,BDD[i][j].which_bit_output);
// right_mask_output_data_all[zj] = right_mask_output_data_b;
// left_mask_output_data_all [zj] = left_mask_output_data_b;
//
// }
int vec_length=31;
#pragma omp parallel for
for(long zj=0;zj<BDD_width_each_layer[i]*BSD_samples;zj++){
int j = int(zj/BSD_samples);
int zi = int(zj%BSD_samples);
bool mask_input_data_left [parameter_input_bit_width];
bool mask_input_data_right[parameter_input_bit_width];
for (int jj=0;jj<parameter_input_bit_width;jj++){
mask_input_data_left [jj] = mask_input_data[zi][jj];
mask_input_data_right[jj] = mask_input_data[zi][jj];
}
for (int jj=0;jj<i;jj++){
mask_input_data_left [most_influence[jj]] = BDD_mask_this[j].mask[most_influence[jj]];
mask_input_data_right[most_influence[jj]] = BDD_mask_this[j].mask[most_influence[jj]];
for(long zk=0;zk<int(BDD_width_each_layer[i]*int(BSD_samples/vec_length));zk++){
bool** vec_input_left = new bool* [parameter_input_bit_width];
bool** vec_input_right = new bool* [parameter_input_bit_width];
for(int kk=0;kk<parameter_input_bit_width;kk++){
vec_input_left[kk] = new bool [32];
vec_input_right[kk] = new bool [32];
}
int* vec_input_left_int = new int [parameter_input_bit_width];
int* vec_input_right_int = new int [parameter_input_bit_width];
int j = int(vec_length*zk/BSD_samples);
for(int kk=0;kk<32;kk++){
if(kk<vec_length){
long zj= vec_length*zk+kk;
int zi = int(zj%BSD_samples);
for (int jj=0;jj<parameter_input_bit_width;jj++){
vec_input_left [jj][kk] = mask_input_data[zi][jj];
vec_input_right[jj][kk] = mask_input_data[zi][jj];
}
for (int jj=0;jj<i;jj++){
vec_input_left [most_influence[jj]][kk] = BDD_mask_this[j].mask[most_influence[jj]];
vec_input_right[most_influence[jj]][kk] = BDD_mask_this[j].mask[most_influence[jj]];
}
vec_input_left [most_influence[i]][kk] = 0;
vec_input_right[most_influence[i]][kk] = 1;
}else{
for (int jj=0;jj<parameter_input_bit_width;jj++){
vec_input_left [jj][kk] = 0;
vec_input_right[jj][kk] = 0;
}
}
mask_input_data_left [most_influence[i]] = 0;
mask_input_data_right[most_influence[i]] = 1;
bool left_mask_output_data_b = io_generator_single(mask_input_data_left ,BDD[i][j].which_bit_output);
bool right_mask_output_data_b = io_generator_single(mask_input_data_right,BDD[i][j].which_bit_output);
right_mask_output_data_all[zj] = right_mask_output_data_b;
left_mask_output_data_all [zj] = left_mask_output_data_b;
// cout<<vec_input_left[0][kk];
}
// cout<<" ";
//cout<<"Debug 0"<<endl;
for(int kk=0;kk<parameter_input_bit_width;kk++){
vec_input_left_int[kk] = cvt_bit_to_number(vec_input_left[kk],vec_length);
vec_input_right_int[kk] = cvt_bit_to_number(vec_input_right[kk],vec_length);
}
// cout<<hex<<vec_input_left_int[0]<<" input"<<endl;
//cout<<"Debug 1"<<endl;
int vec_output_left_int ;
int vec_output_right_int ;
vec_output_left_int = io_generator_single_vec(vec_input_left_int ,BDD[i][j].which_bit_output);
vec_output_right_int = io_generator_single_vec(vec_input_right_int,BDD[i][j].which_bit_output);
//cout<<"Debug 2"<<endl;
bool* vec_output_left = new bool [32];
bool* vec_output_right = new bool [32];
// cout<<"output "<<hex<<vec_output_left_int<<" ";
cvt_number_to_bit(vec_output_left,vec_output_left_int,32);
cvt_number_to_bit(vec_output_right,vec_output_right_int,32);
// for(int kk=0;kk<32;kk++){
// cout<<vec_output_left[31-kk];
// }
// cout<<endl;
for(int kk=0;kk<vec_length;kk++){
long zj= vec_length*zk+kk;
int j = int(zj/BSD_samples);
int zi = int(zj%BSD_samples);
right_mask_output_data_all[zj] = vec_output_right[31-kk];
left_mask_output_data_all [zj] = vec_output_left [31-kk];
//bool* test_vec_input_right = new bool [parameter_input_bit_width];
//bool* test_vec_input_left = new bool [parameter_input_bit_width];
//for(int jj=0;jj<parameter_input_bit_width;jj++){
// test_vec_input_right[jj] = vec_input_right[jj][kk] ;
// test_vec_input_left[jj] = vec_input_left [jj][kk] ;
//}
//right_mask_output_data_all[zj] = io_generator_single(test_vec_input_right,BDD[i][j].which_bit_output);
//left_mask_output_data_all[zj] = io_generator_single(test_vec_input_left, BDD[i][j].which_bit_output);
}
for(int kk=0;kk<parameter_input_bit_width;kk++){
delete [] vec_input_left[kk] ;
delete [] vec_input_right[kk] ;
}
delete [] vec_input_left ;
delete [] vec_input_right ;
delete [] vec_output_left ;
delete [] vec_output_right;
}
for(int j=0;j<BDD_width_each_layer[i];j++){
......@@ -770,7 +875,7 @@ int BDD_class::BDD_infer(BDD_node** BDD,int* most_influence){
//#pragma omp parallel for
for(long zj=0;zj<how_many_start_nodes*parameter_test_ios;zj++){
int test_bit = int(zj/parameter_test_ios);
bool test_input_data [parameter_input_bit_width];
bool* test_input_data = new bool [parameter_input_bit_width];
bool test_output_data;
bool infer_output_data;
for (int j=0;j<parameter_input_bit_width;j++){
......@@ -789,6 +894,7 @@ int BDD_class::BDD_infer(BDD_node** BDD,int* most_influence){
test_output_data = io_generator_single(test_input_data,BDD[start_depth][test_bit].which_bit_output);
infer_output_data = cal_infer_result(test_input_data,test_bit,0);
error_all[zj] = (test_output_data != infer_output_data);
delete [] test_input_data;
}
circuit_accuracy_all_bits = new double [how_many_start_nodes];
for(int test_bit=0;test_bit<how_many_start_nodes;test_bit++){
......
This diff is collapsed. Click to expand it.
......@@ -2,9 +2,19 @@ src/
The latest version of the BSD Learner.
1. Use BSD_Learner to design your own circuit.
1. For AIGs, modify and run write_vec.h
Edit top.h:
Modify:
Line 1 your own module name.
Execute in the terminal:
bash write_vec.sh
2. Use BSD_Learner to design your own circuit.
Modify top.h:
Line 1: modify input bitwidth;
Line 2: modify output bitwidth;
......
extern const int parameter_input_bit_width = 33+5; //输入bit有几位,写在+6前面。+6是为了防止一些bug的冗余设计。
extern const int parameter_output_bit_width = 25 ; //输出bit有几位
#include"io_generator/c1908.h"
#include"io_generator_function.h"
#include"c1908_vec.h"
//#include"io_generator_function.h"
int parameter_search_iterations = 1000; //最大设计次数
int parameter_test_ios = 100; //测试要求多少样本
extern const int parameter_max_samples = int(parameter_test_ios*20); //BSD每一个节点最多进行多少次采样
int parameter_test_ios = 1024; //测试要求多少样本
extern const int parameter_max_samples = int(parameter_test_ios*16); //BSD每一个节点最多进行多少次采样
bool* io_generator_function(bool input_data[parameter_input_bit_width],int which_demo_function, bool* output_data) {
bool* io_generator_function(bool input_data[parameter_input_bit_width], bool* output_data) {
int i,j;
......@@ -18,7 +19,23 @@ bool* io_generator_function(bool input_data[parameter_input_bit_width],int which
for(i=0;i<parameter_output_bit_width;i++){
output_data[i] = output_data_temp[i];
}
delete output_data_temp;
delete [] output_data_temp;
return output_data;
}
int* io_generator_function_vec(int input_data[parameter_input_bit_width], int* output_data) {
int i,j;
int* output_data_temp = new int [100];
io_generator_outer_vec(input_data,output_data_temp);
//io_generator_single_function_1(input_data,output_data_temp);
for(i=0;i<parameter_output_bit_width;i++){
output_data[i] = output_data_temp[i];
}
delete [] output_data_temp;
return output_data;
}
module_name="c1908"
vim -c "open io_generator/${module_name}.h" \
-c "1d"\
-c "1d"\
-c ":$"\
-c "d"
cp io_generator/${module_name}.h ${module_name}_vec.h
vim -c "open ${module_name}_vec.h" \
-c "1d" \
-c "1d" \
-c "1,$ s/io_generator_outer/io_generator_outer_vec"
vim -c "open ${module_name}_vec.h" \
-c "1,$ s/vec_vec/vec" \
-c "1,$ s/bool/int/g" \
-c "1,$ s/!/\~/g" \
-c "1,$ s/&&/and/g" \
-c "1,$ s/and/\&/g" \
-c "1,$ s/false/0/g" \
-c "1,$ s/true/-1/g" \
......@@ -2,5 +2,6 @@ export PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/bin:/lustre
export LIBRARY_PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/lib
export LD_LIBRARY_PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/lib
rm rtl/*
#bash write_vec.sh
g++ BSD.cpp -O3 -std=c++11 -fopenmp -pg
./a.out
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment