Commit 6cce9111 by chengshuyao

Debug int overflow

parent c37f5e7c
...@@ -32,14 +32,14 @@ using namespace std; ...@@ -32,14 +32,14 @@ using namespace std;
//电路的parameter Circuit_parameter //电路的parameter Circuit_parameter
int circuit_index = 9999; //电路编号 int circuit_index = 9999; //电路编号
extern const int parameter_max_orders = 8; extern const int parameter_max_orders = 2;
//算法的parameter Algorithm_parameter //算法的parameter Algorithm_parameter
extern const int parameter_num_threads = 64; //线程数 extern const int parameter_num_threads = 64; //线程数
extern const int parameter_multi_output_index = 0; //BSD从第几层开始化简,前面若干层展开序确定 extern const int parameter_multi_output_index = 0; //BSD从第几层开始化简,前面若干层展开序确定
extern const int parameter_max_BDD_width = 40000; //BSD每一层最多多少个节点 extern const int parameter_max_BDD_width = 320000; //BSD每一层最多多少个节点
int parameter_early_stop_depth = parameter_input_bit_width; //BSD到第几层终止,输出此时的不准确BSD int parameter_early_stop_depth = parameter_input_bit_width; //BSD到第几层终止,输出此时的不准确BSD
int parameter_early_stop_split_nodes= 1000000; //BSD每一层最多多少个节点 int parameter_early_stop_split_nodes= 1000000; //BSD每一层最多多少个节点
...@@ -84,7 +84,7 @@ public: ...@@ -84,7 +84,7 @@ public:
accuracy_layers = new int [parameter_input_bit_width]; accuracy_layers = new int [parameter_input_bit_width];
BDD_width_each_layer = new int [parameter_input_bit_width]; BDD_width_each_layer = new int [parameter_input_bit_width];
} }
//int nodes_for_each_start_node[parameter_max_BDD_width]; //int nodes_for_each_start_nodparameter_max_BDD_width];
}; };
BSD_features BSD_features_0; BSD_features BSD_features_0;
...@@ -107,7 +107,7 @@ int main(int argc,char* argv[]){ ...@@ -107,7 +107,7 @@ int main(int argc,char* argv[]){
for(int i=0;i<parameter_output_bit_width;i++) for(int i=0;i<parameter_output_bit_width;i++)
default_partition_set[i] = 1; default_partition_set[i] = 1;
//for(int i=0;i<parameter_output_bit_width;i++) //for(int i=0;i<parameter_output_bit_width;i++)
// default_partition_set[0] = 1; default_partition_set[0] = 1;
//io generator来自真值表,不来自写好的文件 //io generator来自真值表,不来自写好的文件
...@@ -140,7 +140,7 @@ int main(int argc,char* argv[]){ ...@@ -140,7 +140,7 @@ int main(int argc,char* argv[]){
int* start_order = new int [parameter_input_bit_width]; int* start_order = new int [parameter_input_bit_width];
int area_a = search_order(parameter_search_iterations,default_partition_set,0,start_order); int area_a = search_order(10,default_partition_set,0,start_order);
//search_partition(parameter_input_bit_width,start_order); //search_partition(parameter_input_bit_width,start_order);
}; };
int search_partition(int start_order_depth, int* start_order){ int search_partition(int start_order_depth, int* start_order){
...@@ -157,6 +157,10 @@ int search_partition(int start_order_depth, int* start_order){ ...@@ -157,6 +157,10 @@ int search_partition(int start_order_depth, int* start_order){
best_output_partition_set_a[i]=0; best_output_partition_set_a[i]=0;
best_output_partition_set_b[i]=0; best_output_partition_set_b[i]=0;
} }
best_area = search_order(1,default_partition_set,parameter_input_bit_width,start_order);
cout<<"###########################################################################"<<endl;
cout<<"Best Design Area: "<<best_area<<" "<<best_area_a<<" + "<<best_area_b<<endl;
cout<<"###########################################################################"<<endl;
for (int j=0;j<2;j++){ for (int j=0;j<2;j++){
bool* output_partition_set_a = new bool [parameter_output_bit_width]; bool* output_partition_set_a = new bool [parameter_output_bit_width];
bool* output_partition_set_b = new bool [parameter_output_bit_width]; bool* output_partition_set_b = new bool [parameter_output_bit_width];
...@@ -218,13 +222,13 @@ int BSD_execute(int variable_order_number,int** variable_order, int partition_de ...@@ -218,13 +222,13 @@ int BSD_execute(int variable_order_number,int** variable_order, int partition_de
cout<<"BSD execute start"<<endl; cout<<"BSD execute start"<<endl;
BDD_class BDD_class_main; BDD_class BDD_class_main;
BDD_class_main.output_partition_set = output_partition_set; cout<<"This variable order: "<<variable_order_number<<endl;
BDD_class_main.which_demo_function = GLOBAL_which_demo_function;
for (int j=0;j<parameter_max_orders;j++){ for (int j=0;j<parameter_max_orders;j++){
//cout<<"j"<<j<<endl; //cout<<"j"<<j<<endl;
BDD_class_main.BSD_variable_order[j] = new int [parameter_input_bit_width]; BDD_class_main.BSD_variable_order[j] = new int [parameter_input_bit_width];
} }
cout<<"This variable order: "<<variable_order_number<<endl; BDD_class_main.output_partition_set = output_partition_set;
BDD_class_main.which_demo_function = GLOBAL_which_demo_function;
//for (int vi=0;vi<partition_parts;vi++){ //for (int vi=0;vi<partition_parts;vi++){
// BDD_class_main.BSD_variable_order_number = variable_order_number; // BDD_class_main.BSD_variable_order_number = variable_order_number;
// for(int i=0;i<variable_order_number;i++){ // for(int i=0;i<variable_order_number;i++){
...@@ -700,6 +704,6 @@ int search_order(int search_iterations,bool* output_partition_set,int start_orde ...@@ -700,6 +704,6 @@ int search_order(int search_iterations,bool* output_partition_set,int start_orde
// } // }
// delete [] variable_order; // delete [] variable_order;
// delete [] best_variable_order; // delete [] best_variable_order;
return area; return reward;
}; };
...@@ -81,6 +81,8 @@ public: ...@@ -81,6 +81,8 @@ public:
double* amount_turn ; double* amount_turn ;
bool ** simplify_list ; bool ** simplify_list ;
int * hash_simplify_list;
bool cal_infer_result(bool* input_data,int which_root_node,bool neg); bool cal_infer_result(bool* input_data,int which_root_node,bool neg);
bool* io_generator(bool* input_data,bool* output_data); bool* io_generator(bool* input_data,bool* output_data);
uint32_t* io_generator_vec(uint32_t* input_data,int* output_data); uint32_t* io_generator_vec(uint32_t* input_data,int* output_data);
...@@ -94,8 +96,9 @@ public: ...@@ -94,8 +96,9 @@ public:
int next_bit_layer_old(int depth); int next_bit_layer_old(int depth);
int next_bit_layer_single(int depth,int which_node_this_layer); int next_bit_layer_single(int depth,int which_node_this_layer);
int compare_simplify_list(int list_line_amount,bool* this_line,bool** simplify_list); int hash_simplify_list_function(bool* list,bool neg);
int compare_simplify_list_neg(int list_line_amount,bool* this_line,bool** simplify_list); int compare_simplify_list(int list_line_amount,bool* this_line,bool** simplify_list,int* hash_simplify_list,int hash_number);
int compare_simplify_list_neg(int list_line_amount,bool* this_line,bool** simplify_list, int* hash_simplify_list,int hash_neg_number);
long total_nodes_amount = 0; long total_nodes_amount = 0;
long total_split_nodes = 0; long total_split_nodes = 0;
...@@ -134,7 +137,11 @@ public: ...@@ -134,7 +137,11 @@ public:
bool* left_mask_output_data_all ; bool* left_mask_output_data_all ;
bool* right_mask_output_data_all ; bool* right_mask_output_data_all ;
int partition_depth = 10; bool* all_one_left_list ;
bool* all_zero_left_list ;
bool* all_one_right_list ;
bool* all_zero_right_list ;
int partition_depth = 1000;
int partition_parts = 2; int partition_parts = 2;
int partition_into_how_many_parts =2; int partition_into_how_many_parts =2;
int* partition_start_node_numbers; int* partition_start_node_numbers;
...@@ -164,6 +171,7 @@ public: ...@@ -164,6 +171,7 @@ public:
mask_input_data = new bool*[parameter_max_samples*2]; mask_input_data = new bool*[parameter_max_samples*2];
mask_output_data = new bool [parameter_max_samples*2]; mask_output_data = new bool [parameter_max_samples*2];
simplify_list = new bool*[parameter_max_BDD_width]; simplify_list = new bool*[parameter_max_BDD_width];
hash_simplify_list = new int [parameter_max_BDD_width];
BDD = new BDD_node*[1+parameter_input_bit_width]; BDD = new BDD_node*[1+parameter_input_bit_width];
BDD_mask_this = new BDD_node_mask[parameter_max_BDD_width]; BDD_mask_this = new BDD_node_mask[parameter_max_BDD_width];
BDD_mask_next = new BDD_node_mask[parameter_max_BDD_width]; BDD_mask_next = new BDD_node_mask[parameter_max_BDD_width];
...@@ -175,8 +183,12 @@ public: ...@@ -175,8 +183,12 @@ public:
right_son_mask = new bool [parameter_input_bit_width]; right_son_mask = new bool [parameter_input_bit_width];
left_mask_output_data = new bool [parameter_max_samples]; left_mask_output_data = new bool [parameter_max_samples];
right_mask_output_data = new bool [parameter_max_samples]; right_mask_output_data = new bool [parameter_max_samples];
left_mask_output_data_all = new bool [long(parameter_max_BDD_width)*long(parameter_max_samples)]; left_mask_output_data_all = new bool [long(parameter_max_BDD_width*parameter_max_samples)];
right_mask_output_data_all = new bool [long(parameter_max_BDD_width)*long(parameter_max_samples)]; right_mask_output_data_all = new bool [long(parameter_max_BDD_width*parameter_max_samples)];
all_one_left_list = new bool [parameter_max_BDD_width];
all_zero_left_list = new bool [parameter_max_BDD_width];
all_one_right_list = new bool [parameter_max_BDD_width];
all_zero_right_list = new bool [parameter_max_BDD_width];
split_nodes_each_layer = new int [parameter_input_bit_width+1]; split_nodes_each_layer = new int [parameter_input_bit_width+1];
accuracy_each_layer = new int [parameter_input_bit_width+1]; accuracy_each_layer = new int [parameter_input_bit_width+1];
...@@ -289,10 +301,6 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -289,10 +301,6 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
bool left_son_neg; bool left_son_neg;
bool right_son_neg; bool right_son_neg;
int left_mask_output_data_sum;
int right_mask_output_data_sum;
int left_mask_output_data_sum_half;
int right_mask_output_data_sum_half;
int which_list_number; int which_list_number;
int which_list_number_neg; int which_list_number_neg;
...@@ -459,6 +467,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -459,6 +467,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
delete [] BDD_mask_this ; delete [] BDD_mask_this ;
delete [] BDD_mask_next ; delete [] BDD_mask_next ;
delete [] simplify_list ; delete [] simplify_list ;
delete [] hash_simplify_list;
delete [] mask_input_data; delete [] mask_input_data;
delete [] split_nodes_each_layer; delete [] split_nodes_each_layer;
...@@ -620,6 +629,121 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -620,6 +629,121 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
} }
#endif #endif
cout<<"Finish sampling IOs"<<endl;
gettimeofday(&finish_time,NULL);
train_time = double(finish_time.tv_usec-start_time.tv_usec+1000000*(finish_time.tv_sec-start_time.tv_sec))/1000000;
cout<<"BSD "<<BDD_id<<" train time = "<<train_time<<"s"<<endl;
//#pragma omp parallel for
for(int j=0;j<BDD_width_each_layer[i];j++){
int left_zeros = 0;
int left_ones = 0;
int right_zeros = 0;
int right_ones = 0;
bool* left_mask_output_data_tmp = new bool [BSD_samples];
bool* right_mask_output_data_tmp = new bool [BSD_samples];
if((i == (parameter_early_stop_depth-1))&&(which_BDD==0) || ((i == (parameter_early_stop_depth-1))&&(which_BDD==1)) || ((total_split_nodes_recursive) > parameter_early_stop_split_nodes-BDD_width_each_layer[i])){
for(int zi=0;zi<min(BSD_samples,10);zi++){
left_mask_output_data_tmp[zi] = left_mask_output_data_all[zi+BSD_samples*j];
if(left_mask_output_data_tmp[zi]){
left_ones += 1;
}else{
left_zeros += 1;
}
}
for(int zi=0;zi<min(BSD_samples,10);zi++){
right_mask_output_data[zi] = right_mask_output_data_all[zi+BSD_samples*j];
if(right_mask_output_data_tmp[zi]){
right_ones += 1;
}else{
right_zeros += 1;
}
}
if(left_ones > left_zeros){
all_one_left_list[j] = 1;
all_zero_left_list[j] = 0;
}else{
all_one_left_list[j] = 0;
all_zero_left_list[j] = 1;
}
if(right_ones > right_zeros){
all_one_right_list[j] = 1;
all_zero_right_list[j] = 0;
}else{
all_one_right_list[j] = 0;
all_zero_right_list[j] = 1;
}
}else if((BDD_width_each_layer[i] > parameter_max_BDD_width/2) ){
cout<<"which node this layer: "<<j<<endl;
cout<<" Finish trained weight = "<<setprecision(12)<<(total_finish_weight)/pow(2.0,20)<<endl;
for(int zi=0;zi<min(BSD_samples,10);zi++){
if(left_mask_output_data_tmp[zi]){
left_ones += 1;
}else{
left_zeros += 1;
}
}
for(int zi=0;zi<min(BSD_samples,10);zi++){
if(right_mask_output_data_tmp[zi]){
right_ones += 1;
}else{
right_zeros += 1;
}
}
if(left_ones > left_zeros){
all_one_left_list[j] = 1;
all_zero_left_list[j] = 0;
}else{
all_one_left_list[j] = 0;
all_zero_left_list[j] = 1;
}
if(right_ones > right_zeros){
all_one_right_list[j] = 1;
all_zero_right_list[j] = 0;
}else{
all_one_right_list[j] = 0;
all_zero_right_list[j] = 1;
}
}else {
all_zero_left_list[j] = 1;
all_one_left_list[j] = 1;
all_zero_right_list[j] = 1;
all_one_right_list[j] = 1;
for(int zi=0;zi<BSD_samples;zi++){
left_mask_output_data_tmp[zi] = left_mask_output_data_all[zi+BSD_samples*j];
if(left_mask_output_data_tmp[zi]){
all_zero_left_list[j] = 0;
}else{
all_one_left_list[j] = 0;
}
if((!all_zero_left_list[j])&&(!all_one_left_list[j])){
break;
}
}
for(int zi=0;zi<BSD_samples;zi++){
right_mask_output_data_tmp[zi] = right_mask_output_data_all[zi+BSD_samples*j];
if(right_mask_output_data_tmp[zi]){
all_zero_right_list[j] = 0;
}else{
all_one_right_list[j] = 0;
}
if((!all_zero_right_list[j])&&(!all_one_right_list[j])){
break;
}
}
}
delete [] left_mask_output_data_tmp ;
delete [] right_mask_output_data_tmp ;
}
cout<<"Finish all one all zero compare "<<endl;
gettimeofday(&finish_time,NULL);
train_time = double(finish_time.tv_usec-start_time.tv_usec+1000000*(finish_time.tv_sec-start_time.tv_sec))/1000000;
cout<<"BSD "<<BDD_id<<" train time = "<<train_time<<"s"<<endl;
for(int j=0;j<BDD_width_each_layer[i];j++){ for(int j=0;j<BDD_width_each_layer[i];j++){
BDD[i][j].this_layer_bit_expansion = most_influence[i]; BDD[i][j].this_layer_bit_expansion = most_influence[i];
...@@ -630,7 +754,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -630,7 +754,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
BDD[i][j].non_equal_number = total_non_equal_nodes; BDD[i][j].non_equal_number = total_non_equal_nodes;
total_non_equal_nodes += 1; total_non_equal_nodes += 1;
} }
//cout<<"Debug 1"<<" ";
for(zi=0;zi<i;zi++){ for(zi=0;zi<i;zi++){
left_son_mask[most_influence[zi]] = BDD_mask_this[j].mask[most_influence[zi]]; left_son_mask[most_influence[zi]] = BDD_mask_this[j].mask[most_influence[zi]];
right_son_mask[most_influence[zi]] = BDD_mask_this[j].mask[most_influence[zi]]; right_son_mask[most_influence[zi]] = BDD_mask_this[j].mask[most_influence[zi]];
...@@ -638,69 +762,41 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -638,69 +762,41 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
left_son_mask[most_influence[i]] = 0; left_son_mask[most_influence[i]] = 0;
right_son_mask[most_influence[i]] = 1; right_son_mask[most_influence[i]] = 1;
bool all_zero_left = 1; bool all_zero_left = all_zero_left_list[j] ;
bool all_one_left = 1; bool all_one_left = all_one_left_list[j] ;
bool all_one_right = 1; bool all_one_right = all_one_right_list[j] ;
bool all_zero_right = 1; bool all_zero_right = all_zero_right_list[j] ;
for(int zi=0;zi<BSD_samples;zi++){ for(int zi=0;zi<BSD_samples;zi++){
left_mask_output_data[zi] = left_mask_output_data_all[zi+BSD_samples*j]; left_mask_output_data[zi] = left_mask_output_data_all[zi+BSD_samples*j];
right_mask_output_data[zi] = right_mask_output_data_all[zi+BSD_samples*j]; right_mask_output_data[zi] = right_mask_output_data_all[zi+BSD_samples*j];
} }
for(int zi=0;zi<BSD_samples;zi++){ //cout<<"Debug 2"<<" ";
int left_zeros = 0;
int left_ones = 0;
int right_zeros = 0;
int right_ones = 0;
for(int zi=0;zi<min(BSD_samples,10);zi++){
if(left_mask_output_data[zi]){ if(left_mask_output_data[zi]){
all_zero_left = 0; left_ones += 1;
}else{ }else{
all_one_left = 0; left_zeros += 1;
}
if((!all_zero_left)&&(!all_one_left)){
break;
} }
} }
for(int zi=0;zi<BSD_samples;zi++){ for(int zi=0;zi<min(BSD_samples,10);zi++){
if(right_mask_output_data[zi]){ if(right_mask_output_data[zi]){
all_zero_right = 0; right_ones += 1;
}else{
all_one_right = 0;
}
if((!all_zero_right)&&(!all_one_right)){
break;
}
}
if((i == (parameter_early_stop_depth-1))&&(which_BDD==0) || ((i == (parameter_early_stop_depth-1))&&(which_BDD==1)) || ((total_split_nodes_recursive) > parameter_early_stop_split_nodes-BDD_width_each_layer[i])){
if(left_mask_output_data_sum > (BSD_samples/2)){
all_one_left = 1;
all_zero_left = 0;
}else{
all_one_left = 0;
all_zero_left = 1;
}
if(right_mask_output_data_sum > (BSD_samples/2)){
all_one_right = 1;
all_zero_right = 0;
}else{
all_one_right = 0;
all_zero_right = 1;
}
}
if((BDD_width_each_layer[i] > parameter_max_BDD_width/2) ){
if(left_mask_output_data_sum > (BSD_samples/2)){
all_one_left = 1;
all_zero_left = 0;
}else{ }else{
all_one_left = 0; right_zeros += 1;
all_zero_left = 1;
}
if(right_mask_output_data_sum > (BSD_samples/2)){
all_one_right = 1;
all_zero_right = 0;
}else{
all_one_right = 0;
all_zero_right = 1;
} }
} }
//cout<<"Debug 3"<<" ";
//cout<<"Debug 4"<<" ";
int hash_left_number = hash_simplify_list_function(left_mask_output_data,0);
int hash_left_neg_number = hash_simplify_list_function(left_mask_output_data,1);
int hash_right_number = hash_simplify_list_function(right_mask_output_data,0);
int hash_right_neg_number = hash_simplify_list_function(right_mask_output_data,1);
if(i>parameter_multi_output_index-1){ if(i>parameter_multi_output_index-1){
if(all_zero_left){ if(all_zero_left){
BDD[i][j].left_node_index = -2; BDD[i][j].left_node_index = -2;
...@@ -710,8 +806,8 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -710,8 +806,8 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
total_finish_weight += BDD[i][j].weight/2; total_finish_weight += BDD[i][j].weight/2;
}else{ }else{
if(((i%how_often_simplify) == 0)){ if(((i%how_often_simplify) == 0)){
which_list_number = compare_simplify_list (BDD_width_each_layer[i+1],left_mask_output_data,simplify_list); which_list_number = compare_simplify_list (BDD_width_each_layer[i+1],left_mask_output_data,simplify_list,hash_simplify_list,hash_left_number);
which_list_number_neg = compare_simplify_list_neg(BDD_width_each_layer[i+1],left_mask_output_data,simplify_list); which_list_number_neg = compare_simplify_list_neg(BDD_width_each_layer[i+1],left_mask_output_data,simplify_list,hash_simplify_list,hash_left_neg_number);
it_cannot_simplify = (which_list_number < 0)&&(which_list_number_neg<0); it_cannot_simplify = (which_list_number < 0)&&(which_list_number_neg<0);
it_can_simplify = (which_list_number >=0); it_can_simplify = (which_list_number >=0);
it_can_simplify_neg = (which_list_number_neg >=0); it_can_simplify_neg = (which_list_number_neg >=0);
...@@ -736,6 +832,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -736,6 +832,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
for (zi=0;zi<BSD_samples;zi++){ for (zi=0;zi<BSD_samples;zi++){
simplify_list[BDD_width_each_layer[i+1]-1][zi] = left_mask_output_data[zi]; simplify_list[BDD_width_each_layer[i+1]-1][zi] = left_mask_output_data[zi];
} }
hash_simplify_list[BDD_width_each_layer[i+1]-1] = hash_left_number;
}else if(it_can_simplify){ }else if(it_can_simplify){
BDD[i][j].left_node_index = which_list_number; BDD[i][j].left_node_index = which_list_number;
BDD[i][j].left_node_neg = 0; BDD[i][j].left_node_neg = 0;
...@@ -785,6 +882,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -785,6 +882,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
for (zi=0;zi<BSD_samples;zi++){ for (zi=0;zi<BSD_samples;zi++){
simplify_list[BDD_width_each_layer[i+1]-1][zi] = left_mask_output_data[zi]; simplify_list[BDD_width_each_layer[i+1]-1][zi] = left_mask_output_data[zi];
} }
hash_simplify_list[BDD_width_each_layer[i+1]-1] = hash_left_number;
} }
if(i>parameter_multi_output_index-1){ if(i>parameter_multi_output_index-1){
...@@ -796,8 +894,8 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -796,8 +894,8 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
total_finish_weight += BDD[i][j].weight/2; total_finish_weight += BDD[i][j].weight/2;
}else{ }else{
if(((i%how_often_simplify == 0))){ if(((i%how_often_simplify == 0))){
which_list_number = compare_simplify_list(BDD_width_each_layer[i+1],right_mask_output_data,simplify_list); which_list_number = compare_simplify_list(BDD_width_each_layer[i+1],right_mask_output_data,simplify_list,hash_simplify_list,hash_right_number);
which_list_number_neg = compare_simplify_list_neg(BDD_width_each_layer[i+1],right_mask_output_data,simplify_list); which_list_number_neg = compare_simplify_list_neg(BDD_width_each_layer[i+1],right_mask_output_data,simplify_list,hash_simplify_list,hash_right_neg_number);
it_cannot_simplify = (which_list_number < 0)&&(which_list_number_neg<0); it_cannot_simplify = (which_list_number < 0)&&(which_list_number_neg<0);
it_can_simplify = (which_list_number >=0); it_can_simplify = (which_list_number >=0);
it_can_simplify_neg = (which_list_number_neg >=0); it_can_simplify_neg = (which_list_number_neg >=0);
...@@ -821,6 +919,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -821,6 +919,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
for (zi=0;zi<BSD_samples;zi++){ for (zi=0;zi<BSD_samples;zi++){
simplify_list[BDD_width_each_layer[i+1]-1][zi] = right_mask_output_data[zi]; simplify_list[BDD_width_each_layer[i+1]-1][zi] = right_mask_output_data[zi];
} }
hash_simplify_list[BDD_width_each_layer[i+1]-1] = hash_right_number;
}else if(it_can_simplify){ }else if(it_can_simplify){
BDD[i][j].right_node_index = which_list_number; BDD[i][j].right_node_index = which_list_number;
BDD[i][j].right_node_neg = 0; BDD[i][j].right_node_neg = 0;
...@@ -853,6 +952,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -853,6 +952,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
for (zi=0;zi<BSD_samples;zi++){ for (zi=0;zi<BSD_samples;zi++){
simplify_list[BDD_width_each_layer[i+1]-1][zi] = right_mask_output_data[zi]; simplify_list[BDD_width_each_layer[i+1]-1][zi] = right_mask_output_data[zi];
} }
hash_simplify_list[BDD_width_each_layer[i+1]-1] = hash_right_number;
} }
} }
}else{ }else{
...@@ -872,8 +972,10 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -872,8 +972,10 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
for (zi=0;zi<BSD_samples;zi++){ for (zi=0;zi<BSD_samples;zi++){
simplify_list[BDD_width_each_layer[i+1]-1][zi] = right_mask_output_data[zi]; simplify_list[BDD_width_each_layer[i+1]-1][zi] = right_mask_output_data[zi];
} }
hash_simplify_list[BDD_width_each_layer[i+1]-1] = hash_right_number;
} }
//cout<<"Debug 5"<<" ";
if(BDD[i][j].left_node_index != BDD[i][j].right_node_index){ if(BDD[i][j].left_node_index != BDD[i][j].right_node_index){
total_split_nodes += 1; total_split_nodes += 1;
BDD_split_nodes_each_layer[i] += 1; BDD_split_nodes_each_layer[i] += 1;
...@@ -886,6 +988,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int ...@@ -886,6 +988,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
} }
} }
} }
//cout<<"Debug 6"<<" ";
for(zi=0;zi<how_many_start_nodes;zi++){ for(zi=0;zi<how_many_start_nodes;zi++){
root_nodes_leafs[zi] = 0; root_nodes_leafs[zi] = 0;
for(int zj=0;zj<BDD_width_each_layer[i+1];zj++){ for(int zj=0;zj<BDD_width_each_layer[i+1];zj++){
...@@ -1059,7 +1162,7 @@ int BDD_class::BDD_FULL_PROCESS(){ ...@@ -1059,7 +1162,7 @@ int BDD_class::BDD_FULL_PROCESS(){
cout<<"ready to train"<<endl; cout<<"ready to train"<<endl;
for (j=0;j<parameter_max_samples;j++){ for (j=0;j<parameter_max_samples;j++){
mask_input_data[j] = new bool[parameter_input_bit_width*2]; mask_input_data[j] = new bool[parameter_input_bit_width+2];
} }
// for (j=0;j<parameter_max_orders;j++){ // for (j=0;j<parameter_max_orders;j++){
// BSD_variable_order[j] = new int [parameter_input_bit_width]; // BSD_variable_order[j] = new int [parameter_input_bit_width];
......
...@@ -275,8 +275,8 @@ int BDD_class::next_bit_layer_1(int depth){ ...@@ -275,8 +275,8 @@ int BDD_class::next_bit_layer_1(int depth){
}else if(all_one_left){ }else if(all_one_left){
change_nodes[this_bit_expansion]+=1; change_nodes[this_bit_expansion]+=1;
}else{ }else{
which_list_number_l = compare_simplify_list (how_many_nodes_if_expansion[this_bit_expansion],left_mask_output_data,simplify_list); //which_list_number_l = compare_simplify_list (how_many_nodes_if_expansion[this_bit_expansion],left_mask_output_data,simplify_list);
which_list_number_neg_l = compare_simplify_list_neg(how_many_nodes_if_expansion[this_bit_expansion],left_mask_output_data,simplify_list); //which_list_number_neg_l = compare_simplify_list_neg(how_many_nodes_if_expansion[this_bit_expansion],left_mask_output_data,simplify_list);
bool it_cannot_simplify = (which_list_number_l < 0)&&(which_list_number_neg_l<0); bool it_cannot_simplify = (which_list_number_l < 0)&&(which_list_number_neg_l<0);
bool it_can_simplify = (which_list_number_l >=0); bool it_can_simplify = (which_list_number_l >=0);
bool it_can_simplify_neg = (which_list_number_neg_l >=0); bool it_can_simplify_neg = (which_list_number_neg_l >=0);
...@@ -296,8 +296,8 @@ int BDD_class::next_bit_layer_1(int depth){ ...@@ -296,8 +296,8 @@ int BDD_class::next_bit_layer_1(int depth){
}else if(all_one_right){ }else if(all_one_right){
change_nodes[this_bit_expansion]+=1; change_nodes[this_bit_expansion]+=1;
}else{ }else{
which_list_number_r = compare_simplify_list(how_many_nodes_if_expansion[this_bit_expansion],right_mask_output_data,simplify_list); //which_list_number_r = compare_simplify_list(how_many_nodes_if_expansion[this_bit_expansion],right_mask_output_data,simplify_list);
which_list_number_neg_r = compare_simplify_list_neg(how_many_nodes_if_expansion[this_bit_expansion],right_mask_output_data,simplify_list); //which_list_number_neg_r = compare_simplify_list_neg(how_many_nodes_if_expansion[this_bit_expansion],right_mask_output_data,simplify_list);
bool it_cannot_simplify = (which_list_number_r < 0)&&(which_list_number_neg_r<0); bool it_cannot_simplify = (which_list_number_r < 0)&&(which_list_number_neg_r<0);
bool it_can_simplify = (which_list_number_r >=0); bool it_can_simplify = (which_list_number_r >=0);
bool it_can_simplify_neg = (which_list_number_neg_r >=0); bool it_can_simplify_neg = (which_list_number_neg_r >=0);
......
...@@ -30,8 +30,37 @@ int BDD_class::mask_random_input_data(int depth,bool* mask,int amount,int* most_ ...@@ -30,8 +30,37 @@ int BDD_class::mask_random_input_data(int depth,bool* mask,int amount,int* most_
return 0; return 0;
}; };
int BDD_class::hash_simplify_list_function(bool* list, bool neg){
int BDD_class::compare_simplify_list(int list_line_amount,bool* this_line,bool** simplify_list){ int a = int(BSD_samples/1);
int b = int(BSD_samples/2);
int c = int(BSD_samples/3);
int d = int(BSD_samples/4);
int line_sum_a=0;
int line_sum_b=0;
int line_sum_c=0;
int line_sum_d=0;
for(int i=0;i<BSD_samples;i++){
if(i<d){
if(list[i]==!neg)
line_sum_d += 1;
}else if (i<c){
if(list[i]==!neg)
line_sum_c += 1;
}else if (i<b){
if(list[i]==!neg)
line_sum_b += 1;
}
else if (i<a){
if(list[i]==!neg)
line_sum_a += 1;
}
}
int line_sum = line_sum_d * 3 + line_sum_c * 5 + line_sum_b * 7 + line_sum_a;
return line_sum;
}
int BDD_class::compare_simplify_list(int list_line_amount,bool* this_line,bool** simplify_list, int* hash_simplify_list, int hash_number){
int which_list_number = -1; int which_list_number = -1;
bool it_can_simplify = 0; bool it_can_simplify = 0;
int i,j; int i,j;
...@@ -40,10 +69,14 @@ int BDD_class::compare_simplify_list(int list_line_amount,bool* this_line,bool** ...@@ -40,10 +69,14 @@ int BDD_class::compare_simplify_list(int list_line_amount,bool* this_line,bool**
if(1){ if(1){
for (int i=list_line_amount-1;i>=0;i--){ for (int i=list_line_amount-1;i>=0;i--){
it_can_simplify_here = 1; it_can_simplify_here = 1;
for(int j=0;j<BSD_samples;j++){ if(hash_number!=hash_simplify_list[i]){
if(simplify_list[i][j] != this_line[j]){ it_can_simplify_here = 0;
it_can_simplify_here = 0; }else{
break; for(int j=0;j<BSD_samples;j++){
if(simplify_list[i][j] != this_line[j]){
it_can_simplify_here = 0;
break;
}
} }
} }
if(it_can_simplify_here){ if(it_can_simplify_here){
...@@ -55,7 +88,7 @@ int BDD_class::compare_simplify_list(int list_line_amount,bool* this_line,bool** ...@@ -55,7 +88,7 @@ int BDD_class::compare_simplify_list(int list_line_amount,bool* this_line,bool**
} }
return which_list_number; return which_list_number;
}; };
int BDD_class::compare_simplify_list_neg(int list_line_amount,bool* this_line,bool** simplify_list){ int BDD_class::compare_simplify_list_neg(int list_line_amount,bool* this_line,bool** simplify_list,int * hash_simplify_list,int hash_neg_number){
int which_list_number = -1; int which_list_number = -1;
//return which_list_number; //return which_list_number;
bool it_can_simplify = 0; bool it_can_simplify = 0;
...@@ -65,10 +98,14 @@ int BDD_class::compare_simplify_list_neg(int list_line_amount,bool* this_line,bo ...@@ -65,10 +98,14 @@ int BDD_class::compare_simplify_list_neg(int list_line_amount,bool* this_line,bo
if(1){ if(1){
for (i=list_line_amount-1;i>=0;i--){ for (i=list_line_amount-1;i>=0;i--){
it_can_simplify_here = 1; it_can_simplify_here = 1;
for(int j=0;j<BSD_samples;j++){ if(hash_neg_number!=hash_simplify_list[i]){
if(simplify_list[i][j] == this_line[j]){ it_can_simplify_here = 0;
it_can_simplify_here = 0; }else{
break; for(int j=0;j<BSD_samples;j++){
if(simplify_list[i][j] == this_line[j]){
it_can_simplify_here = 0;
break;
}
} }
} }
if(it_can_simplify_here){ if(it_can_simplify_here){
......
#define INPUT_AIG #define INPUT_AIG
#include"io_generator/c1908.h" #include "usb1_crc16.h"
#include "c1908_vec.h" #include "usb1_crc16_vec.h"
extern const int parameter_input_bit_width = PI_WIDTH + 5 ; extern const int parameter_input_bit_width = PI_WIDTH + 5 ;
extern const int parameter_output_bit_width = PO_WIDTH ; extern const int parameter_output_bit_width = PO_WIDTH ;
extern const int parameter_train_output_bit_width = 1 ; //extern const int parameter_train_output_bit_width = 1 ;
//int parameter_input_bit_width = 80+5; //输入bit有几位,写在+6前面。+6是为了防止一些bug的冗余设计。 //int parameter_input_bit_width = 80+5; //输入bit有几位,写在+6前面。+6是为了防止一些bug的冗余设计。
...@@ -15,9 +15,9 @@ extern const int parameter_train_output_bit_width = 1 ; ...@@ -15,9 +15,9 @@ extern const int parameter_train_output_bit_width = 1 ;
//#include"io_generator_tmp.h" //#include"io_generator_tmp.h"
extern const int parameter_search_iterations = 400; //最大设计次数 extern const int parameter_search_iterations = 1; //最大设计次数
extern const int parameter_test_ios = 1000; //测试要求多少样本 extern const int parameter_test_ios = 1000; //测试要求多少样本
extern const int parameter_max_samples = int(parameter_test_ios*10/32)*32; //BSD每一个节点最多进行多少次采样 extern const int parameter_max_samples = int(parameter_test_ios*100/32)*32; //BSD每一个节点最多进行多少次采样
bool* io_generator_function(bool* input_data, bool* output_data) { bool* io_generator_function(bool* input_data, bool* output_data) {
......
module_name="dalu" module_name="usb1_crc16"
vim -c "open io_generator/${module_name}.h" \ #@vim -c "open io_generator/${module_name}.h" \
-c "1d"\ #@ -c "1d"\
-c "1d"\ #@ -c "1d"\
-c ":$"\ #@ -c ":$"\
-c "d" #@ -c "d"
cp io_generator/${module_name}.h ${module_name}_vec.h cp io_generator/${module_name}.h ${module_name}_vec.h
vim -c "open ${module_name}_vec.h" \ vim -c "open ${module_name}_vec.h" \
-c "1d" \ -c "1d" \
-c "1d" \ -c "1d" \
-c "1d" \
-c "1d" \
-c "1,$ s/io_generator_outer/io_generator_outer_vec" -c "1,$ s/io_generator_outer/io_generator_outer_vec"
vim -c "open ${module_name}_vec.h" \ vim -c "open ${module_name}_vec.h" \
-c "1,$ s/vec_vec/vec" \ -c "1,$ s/vec_vec/vec" \
-c "1,$ s/bool/int/g" \ -c "1,$ s/bool/uint32_t/g" \
-c "1,$ s/!/\~/g" \ -c "1,$ s/!/\~/g" \
-c "1,$ s/&&/and/g" \ -c "1,$ s/&&/and/g" \
-c "1,$ s/and/\&/g" \ -c "1,$ s/and/\&/g" \
-c "1,$ s/false/0/g" \ -c "1,$ s/false/0/g" \
-c "1,$ s/true/-1/g" \ -c "1,$ s/true/32'hffffffff/g" \
-c ":$"\
-c "d"
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