Commit f9289063 by chengshuyao

Add hunaglue code: BDD switch layer

parent 2a716ce1
......@@ -2,6 +2,73 @@
#include<iostream>
#include<cstring>
using namespace std;
struct key{
int lc; int rc; bool lc_neg; bool rc_neg;
bool operator==(const key& other) const {
return lc == other.lc && rc == other.rc &&
lc_neg == other.lc_neg && rc_neg == other.rc_neg;
}
};
namespace std{
template <>
struct hash<key> {
size_t operator()(const key& k) const {
size_t h1 = std::hash<int>()(k.lc);
size_t h2 = std::hash<int>()(k.rc);
size_t h3 = std::hash<bool>()(k.lc_neg);
size_t h4 = std::hash<bool>()(k.rc_neg);
// 简单组合哈希值
return h1 ^ (h2 << 1) ^ (h3 << 2) ^ (h4 << 3);
}
};
}
template <typename T>
inline void arr_copy(T target[], const T source[], const int size) {
for (int i = 0; i < size; i++){
target[i] = source[i];
}
}
template <typename T>
inline void arr_init(T arr[], const T val, const int size){
for (int i = 0; i < size; i++){
arr[i] = val;
}
}
template <typename T>
inline void arr_delete(T *&arr){//需要使用引用,因为涉及对arr指向地址的操作
delete [] arr;
arr = nullptr;
}
template <typename T>
inline void arr2d_new(T **&arr, const int size){//需要初始化为nullptr,否则不好释放
arr = new T*[size];
for (int i = 0; i < size; i++){
arr[i] = nullptr; //并没有提前全部分配内存,以节省空间
}
}
//释放堆上的二维数组
template <typename T>
inline void arr2d_delete(T **&arr, const int size){
for (int i = 0; i < size; i++){
delete[] arr[i]; //nullptr会被忽略
}
delete [] arr;
arr = nullptr;
}
// 数组线性搜索
template <typename T>
inline int arr_find(const T val, T *arr, const int size){
for (int i = 0; i < size; i++){
if (arr[i] == val) return i;
}
return -1;
}
int cvt_bit_to_number(bool input_data[], int k){
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -115,16 +115,17 @@ int BDD_class::next_bit_layer_single(int depth,int which_node_this_layer){
};
int BDD_class::next_bit_layer(int depth){
cout<<depth<<" "<<BSD_variable_order_number<<endl;
int BDD_class::next_bit_layer(int depth,int order_num){
cout<<"Depth: "<<depth<<" Order num: "<<BSD_variable_order_number<<endl;
if((depth < BSD_variable_order_number) ){
most_influence[depth] = BSD_variable_order[0][depth];
most_influence[depth] = BSD_variable_order[order_num][depth];
cout<<"Most influence depth"<<most_influence[depth]<<endl;
has_been_unfold[most_influence[depth]]=1;
cout<<most_influence[depth]<<endl;
return BSD_variable_order[0][depth];
return BSD_variable_order[order_num][depth];
}
else
return next_bit_layer_1(depth);
return next_bit_layer_0(depth);
}
int BDD_class::next_bit_layer_1(int depth){
......@@ -137,7 +138,7 @@ int BDD_class::next_bit_layer_1(int depth){
//return most_influence_next;
int most_influence_next=999999;
int most_influence_single=0;
if(depth < 2000){
if(depth < 1){
most_influence_next = next_bit_layer_0(depth);
}
else if(depth==parameter_input_bit_width-1){
......@@ -421,7 +422,7 @@ int BDD_class::next_bit_layer_0(int depth){
}
//USE_THIS:RANDOM
//if(i<64)
// amount_turn[i] = gen()%100;
// amount_turn[i] = gen()%5;
//else
// amount_turn[i] = 0;
......@@ -465,12 +466,12 @@ int BDD_class::next_bit_layer_0(int depth){
double amount_turn_max_divide_average = amount_turn_static[most_influence_next]/amount_turn_average;
double amount_turn_max_ratio = amount_turn[most_influence_next]/(zz+1);
//USE_THIS:BEST
if((depth<parameter_input_bit_width-2) ){
if((amount_turn_max_divide_average < 4) || (amount_turn_max_ratio < 0.3) || ((amount_turn_max_ratio>0.8)&&((amount_turn_max_ratio<0.999)))){
has_been_unfold[most_influence_next] = 0;
most_influence_next = 999999;
}
}
//if((depth<parameter_input_bit_width-2) ){
// if((amount_turn_max_divide_average < 4) || (amount_turn_max_ratio < 0.3) || ((amount_turn_max_ratio>0.8)&&((amount_turn_max_ratio<0.999)))){
// has_been_unfold[most_influence_next] = 0;
// most_influence_next = 999999;
// }
//}
//delete[]amount_turn;
return most_influence_next;
};
extern const int parameter_input_bit_width = 33+6; //输入bit有几位,写在+6前面。+6是为了防止一些bug的冗余设计。
extern const int parameter_output_bit_width = 1 ; //输出bit有几位
extern const int parameter_input_bit_width = 64+5; //输入bit有几位,写在+6前面。+6是为了防止一些bug的冗余设计。
extern const int parameter_output_bit_width = 32 ; //输出bit有几位
#include"io_generator/c1908.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*40); //BSD每一个节点最多进行多少次采样
bool* io_generator_function(bool input_data[parameter_input_bit_width],int which_demo_function, bool* output_data) {
int i,j;
bool output_data_temp [1000];
io_generator_outer(input_data,output_data_temp);
bool* output_data_temp = new bool [100];
//io_generator_outer(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;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -2,5 +2,5 @@ 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/*
g++ BSD.cpp -O0 -std=c++11 -fopenmp -pg
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