Commit e307a20b by chengshuyao

To wenzy: Accuracy first mode.

parent 778053b8
......@@ -26,8 +26,8 @@ public:
mask = new bool [parameter_input_bit_width];
};
~BDD_node(){
delete [] which_root_node_all ;
delete [] mask ;
//delete [] which_root_node_all ;
//delete [] mask ;
};
};
......@@ -38,7 +38,7 @@ public:
mask = new bool [parameter_input_bit_width];
}
~BDD_node_mask(){
delete [] mask;
//delete [] mask;
}
};
class BDD_class{
......@@ -171,29 +171,29 @@ public:
int order_num;
BDD_class(){
most_influence = new int [parameter_input_bit_width];
BDD_width_each_layer = new int [parameter_input_bit_width+1];
mask_input_data = new bool*[parameter_max_samples*2];
mask_output_data = new bool [parameter_max_samples*2];
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_mask_this = new BDD_node_mask[parameter_max_BDD_width];
BDD_mask_next = new BDD_node_mask[parameter_max_BDD_width];
has_been_unfold = new bool[parameter_input_bit_width+1];
amount_turn_output_data = new bool* [parameter_input_bit_width+1];
amount_turn = new double [parameter_input_bit_width];
test_input_data = new bool[parameter_input_bit_width];
left_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];
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)];
right_mask_output_data_all = new bool [long(parameter_max_BDD_width)*long(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];
most_influence = new int [parameter_input_bit_width];
BDD_width_each_layer = new int [parameter_input_bit_width+1];
mask_input_data = new bool*[parameter_max_samples*2];
mask_output_data = new bool [parameter_max_samples*2];
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_mask_this = new BDD_node_mask[parameter_max_BDD_width];
BDD_mask_next = new BDD_node_mask[parameter_max_BDD_width];
has_been_unfold = new bool[parameter_input_bit_width+1];
amount_turn_output_data = new bool* [parameter_input_bit_width+1];
amount_turn = new double [parameter_input_bit_width];
test_input_data = new bool[parameter_input_bit_width];
left_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];
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)];
right_mask_output_data_all = new bool [long(parameter_max_BDD_width)*long(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];
accuracy_each_layer = new int [parameter_input_bit_width+1];
......@@ -460,36 +460,36 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
total_BDD_depth = i;
cout<<"BDD partition on layer "<<i<<endl;
for (int zj=0;zj<parameter_input_bit_width+1;zj++){
delete [] amount_turn_output_data[zj] ;
}
for (int zj=0;zj<parameter_max_BDD_width;zj++){
delete [] simplify_list[zj];
}
for (int zj=0;zj<parameter_max_samples;zj++){
delete [] mask_input_data[zj] ;
}
for(int zj=0;zj<partition_into_how_many_parts;zj++){
delete [] partition_index[zj];
}
delete [] amount_turn_output_data ;
delete [] amount_turn ;
delete [] left_mask_output_data ;
delete [] right_mask_output_data ;
delete [] left_mask_output_data_all ;
delete [] right_mask_output_data_all ;
delete []left_son_mask ;
delete []right_son_mask ;
delete [] BDD_mask_this ;
delete [] BDD_mask_next ;
delete [] simplify_list ;
delete [] hash_simplify_list;
delete [] mask_input_data;
delete [] split_nodes_each_layer;
delete [] accuracy_each_layer ;
delete []BSD_variable_order ;
///for (int zj=0;zj<parameter_input_bit_width+1;zj++){
/// delete [] amount_turn_output_data[zj] ;
///}
///for (int zj=0;zj<parameter_max_BDD_width;zj++){
/// delete [] simplify_list[zj];
///}
///for (int zj=0;zj<parameter_max_samples;zj++){
/// delete [] mask_input_data[zj] ;
///}
///for(int zj=0;zj<partition_into_how_many_parts;zj++){
/// delete [] partition_index[zj];
///
///}
///delete [] amount_turn_output_data ;
///delete [] amount_turn ;
///delete [] left_mask_output_data ;
///delete [] right_mask_output_data ;
///delete [] left_mask_output_data_all ;
///delete [] right_mask_output_data_all ;
///delete []left_son_mask ;
///delete []right_son_mask ;
///delete [] BDD_mask_this ;
///delete [] BDD_mask_next ;
///delete [] simplify_list ;
///delete [] hash_simplify_list;
///delete [] mask_input_data;
///delete [] split_nodes_each_layer;
///delete [] accuracy_each_layer ;
///delete []BSD_variable_order ;
for(zi=0;zi<partition_into_how_many_parts;zi++){
BDD_partition[zi].BDD_FULL_PROCESS();
......@@ -1102,8 +1102,8 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
cout<<"######################################################################"<<endl;
}
delete [] root_nodes_leafs ;
delete [] leaf_nodes_roots ;
//delete [] root_nodes_leafs ;
//delete [] leaf_nodes_roots ;
return 0;
};
......@@ -1165,7 +1165,7 @@ int BDD_class::BDD_infer(BDD_node** BDD,int* most_influence){
for(i=0;i<how_many_start_nodes;i++){
circuit_accuracy += circuit_accuracy_all_bits[i];
}
delete [] circuit_accuracy_all_bits;
//delete [] circuit_accuracy_all_bits;
circuit_accuracy /= how_many_start_nodes;
cout<<"How many start nodes = "<<how_many_start_nodes<<endl;
cout<<"Average Accuracy among all output bits = "<<circuit_accuracy<<endl;
......@@ -1176,7 +1176,7 @@ int BDD_class::BDD_infer(BDD_node** BDD,int* most_influence){
gettimeofday(&finish_time,NULL);
double test_time = double(finish_time.tv_usec-start_time.tv_usec+1000000*(finish_time.tv_sec-start_time.tv_sec))/1000000;
cout<<"Total test time = "<<test_time<<"s"<<endl;
delete [] error_all;
//delete [] error_all;
return 0;
};
......@@ -1398,15 +1398,76 @@ int BDD_class::BDD_FULL_PROCESS(){
//print_circuit(BDD,most_influence);
if(circuit_accuracy>0.9999)
print_circuit(BDD,most_influence,start_depth,start_node_index_string);
delete [] test_input_data;
for (int vi=0;vi<parameter_input_bit_width;vi++){
BSD_variable_order[vi] = most_influence[vi];
}
}
for(int zi=0;zi<parameter_input_bit_width;zi++){
BSD_features_0.BSD_area_layers [zi] = split_nodes_each_layer[zi];
BSD_features_0.accuracy_layers [zi] = accuracy_each_layer[zi];
BSD_features_0.BDD_width_each_layer[zi] = BDD_width_each_layer[zi];
}
if(partition_depth > parameter_input_bit_width){
for(int zi=0;zi<parameter_input_bit_width;zi++){
BSD_features_0.variable_order [zi] = most_influence[zi];
}
}
else{
for(int zi=0;zi<parameter_input_bit_width;zi++){
BSD_features_0.variable_order [zi] = BSD_variable_order[zi];
}
}
BSD_features_0.BSD_depth = total_BDD_depth+1;
BSD_features_0.BSD_area = total_split_nodes_recursive;
BSD_features_0.accuracy = circuit_accuracy;
BSD_features_0.feature_area = feature_area;
//GLOBAL_BDD_nodes += total_nodes_amount;
//GLOBAL_BDD_split_nodes += total_split_nodes;
//cout<<"Total nodes = "<<total_nodes_amount<<endl;
//cout<<"Total split nodes = "<<total_split_nodes<<endl;
//delete [] most_influence ;
//delete [] BDD_width_each_layer ;
//delete [] mask_output_data ;
//delete [] hash_simplify_list ;
//delete [] BDD_mask_this ;
//delete [] BDD_mask_next ;
//delete [] has_been_unfold ;
//delete [] amount_turn ;
//delete [] test_input_data ;
//delete [] left_son_mask ;
//delete [] right_son_mask ;
//delete [] left_mask_output_data ;
//delete [] right_mask_output_data ;
//delete [] left_mask_output_data_all ;
//delete [] right_mask_output_data_all ;
//delete [] all_one_left_list ;
//delete [] all_zero_left_list ;
//delete [] all_one_right_list ;
//delete [] all_zero_right_list ;
//delete [] split_nodes_each_layer ;
//delete [] accuracy_each_layer ;
//delete [] BSD_variable_order ;
//delete [] BDD_split_nodes_each_layer ;
//delete [] output_partition_set ;
//delete [] start_node_index ;
//delete [] start_node_index_string ;
//for (i=0;i<parameter_input_bit_width+1;i++){
// delete []amount_turn_output_data[i] ;
//}
//for (i=0;i<parameter_max_BDD_width;i++){
// delete [] simplify_list[i] ;
//}
//for (i=0;i<parameter_max_samples*2;i++){
// delete [] mask_input_data[i] ;
//}
//delete []amount_turn_output_data = new bool* [parameter_input_bit_width+1];
//delete []simplify_list = new bool*[parameter_max_BDD_width];
//delete []mask_input_data = new bool*[parameter_max_samples*2];
//delete [] BDD ;
return 0;
}
......
......@@ -81,8 +81,8 @@ public:
expand_input_bit_data = new bool [parameter_input_bit_width];
}
~node_index(){
delete [] expand_input_bit_index;
delete [] expand_input_bit_data;
//delete [] expand_input_bit_index;
//delete [] expand_input_bit_data;
}
};
......@@ -92,10 +92,6 @@ node_index* default_start_node_index;
int BSD_execute(int start_node_number, node_index* start_node_index,int variable_order_number, int* variable_order);
#include"BSD.h"
#include"next_layer_bit.h"
#include"tool_function.h"
#include"print_circuit.h"
......@@ -110,17 +106,23 @@ public:
int* BSD_area_layers;
int* accuracy_layers;
int* BDD_width_each_layer;
int* variable_order;
int feature_area;
BSD_features(){
BSD_area_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];
variable_order = new int [parameter_input_bit_width];
}
//int nodes_for_each_start_nodparameter_max_BDD_width];
};
BSD_features BSD_features_0;
#include"BSD.h"
#include"next_layer_bit.h"
#include"tool_function.h"
#include"print_circuit.h"
bool* default_partition_set;
int* default_start_order;
......@@ -207,7 +209,6 @@ void set_default(){
}
BSD_features BSD_features_0;
//double variable_features[parameter_input_bit_width];
int search_order(int start_node_number , int start_node_depth, node_index* start_node_index,int search_iterations, int* start_order);
int search_reward(BSD_features BSD_features_0);
......@@ -215,7 +216,13 @@ int search_partition(int start_node_number,int start_node_depth , node_index* st
int search_partition(int start_node_number=default_start_node_number,int start_node_depth = 0, node_index* start_node_index = default_start_node_index, int* start_order = default_start_order){
int search_order_times = 5;
int search_order_times = 2;
int min_partition_parts ;
#ifdef ACCURACY_FIRST
min_partition_parts = start_node_number;
#else
min_partition_parts = 0;
#endif
random_device rd;
mt19937 gen(rd());
......@@ -258,6 +265,7 @@ int search_partition(int start_node_number=default_start_node_number,int start_n
}
area_parts[i] = search_order(start_node_partition , start_node_depth, start_node_index_partition, search_order_times, start_order);
area += area_parts[i];
//delete [] start_node_index_partition;
}
if(area<best_area){
best_area = area;
......@@ -328,7 +336,7 @@ int search_partition(int start_node_number=default_start_node_number,int start_n
cout<<"Best Design Area: "<<best_area<<endl;
cout<<"###########################################################################"<<endl;
for (int partition_parts=max_partition_parts-1;partition_parts>0;partition_parts--){
for (int partition_parts=max_partition_parts-1;partition_parts>min_partition_parts;partition_parts--){
int use_part;
for (use_part=0;use_part<partition_parts;use_part++){
bool merge_success = 0;
......@@ -386,6 +394,7 @@ int search_partition(int start_node_number=default_start_node_number,int start_n
}
area_parts[i] = search_order(start_node_partition , start_node_depth, start_node_index_partition, search_order_times, start_order);
area += area_parts[i];
//delete [] start_node_index_partition;
}
}
......@@ -479,6 +488,15 @@ int search_partition(int start_node_number=default_start_node_number,int start_n
}
cout<<"###########################################################################"<<endl;
//for (int i=0;i<max_partition_parts;i++){
// delete [] partition_sets[i] ;
// delete [] best_partition_sets[i] ;
//}
//delete [] partition_sets ;
//delete [] best_partition_sets ;
//delete [] area_parts ;
//delete [] best_area_parts ;
};
int BSD_execute(int start_node_number, node_index* start_node_index,int variable_order_number, int* variable_order){
......@@ -526,27 +544,10 @@ int BSD_execute(int start_node_number, node_index* start_node_index,int variable
BDD_class_main.BDD_FULL_PROCESS();
for(int zi=0;zi<parameter_input_bit_width;zi++){
BSD_features_0.BSD_area_layers [zi] = BDD_class_main.split_nodes_each_layer[zi];
BSD_features_0.accuracy_layers [zi] = BDD_class_main.accuracy_each_layer[zi];
BSD_features_0.BDD_width_each_layer[zi] = BDD_class_main.BDD_width_each_layer[zi];
}
if(BDD_class_main.partition_depth > parameter_input_bit_width){
for(int zi=0;zi<parameter_input_bit_width;zi++){
variable_order [zi] = BDD_class_main.most_influence[zi];
}
variable_order[zi] = BSD_features_0.variable_order [zi] ;
}
else{
for(int zi=0;zi<parameter_input_bit_width;zi++){
variable_order [zi] = BDD_class_main.BSD_variable_order[zi];
}
}
BSD_features_0.BSD_depth = BDD_class_main.total_BDD_depth+1;
BSD_features_0.BSD_area = BDD_class_main.total_split_nodes_recursive;
BSD_features_0.accuracy = BDD_class_main.circuit_accuracy;
BSD_features_0.feature_area = BDD_class_main.feature_area;
int reward = search_reward(BSD_features_0);
return reward;
......@@ -954,10 +955,10 @@ int search_order(int start_node_number = default_start_node_number, int start_no
//delete [] best_rewards ;
//delete [] best_area_depths;
//for (int vi=0;vi<parameter_max_orders;vi++){
// delete [] variable_order[vi];
// delete [] multi_variable_order[vi];
// delete [] best_variable_order[vi];
//}
//delete [] variable_order;
//delete [] multi_variable_order;
//delete [] best_variable_order;
return reward;
......
#include "head.h"
#include "io_generator/c432.h" //io_generator中需要包含对PI_WIDTH,PO_WIDTH的全局定义,如: extern const int PI_WIDTH = 36;
#include "io_generator_vec/c432_vec.h" //如果有对应Verilog, 可以在aag_to_rtl里面直接生成2个文件
//#include "io_generator/c1355.h" //io_generator中需要包含对PI_WIDTH,PO_WIDTH的全局定义,如: extern const int PI_WIDTH = 36;
//#include "io_generator_vec/c1355_vec.h" //如果有对应Verilog, 可以在aag_to_rtl里面直接生成2个文件
#include "io_generator/ip-cores/combinational_circuits/c_lod.h"
#include "io_generator/ip-cores/combinational_circuits_vec/c_lod_vec.h"
#define INPUT_AIG //io_generator是否可以用uint按位操作进行加速,也即是否包含_vec后缀的另一个io_generator
#define SINGLE_BITS //io_generator是否包含每一个bit单独的io_generator_o{x}
//#define SINGLE_BITS //io_generator是否包含每一个bit单独的io_generator_o{x}
//#define SEARCH_PARTITION //BSD算法搜索partition策略
#define SEARCH_PARTITION //BSD算法搜索partition策略
#define ACCURACY_FIRST //精度优先算法
extern const int parameter_input_bit_width = PI_WIDTH +5 ;
int parameter_output_bit_width = PO_WIDTH;
extern const int parameter_search_iterations = 10; //最大设计次数
extern const int parameter_test_ios = 10000; //测试要求多少样本
extern const int parameter_test_ios = 1000000; //测试要求多少样本
extern const int parameter_max_samples = 64*100; //BSD每一个节点最多进行多少次采样,至少为64
extern const double parameter_early_stop_accuracy = 1; //允许的错误率,如果完全不允许,设为1;
//没有特殊需要不要设到<1,会慢一些。
......
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