Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
BSD
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
chengshuyao
BSD
Commits
7889538b
Commit
7889538b
authored
Jul 18, 2025
by
chengshuyao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add vector mode for AIGs
parent
6751fa64
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
184 additions
and
31 deletions
+184
-31
src/BSD.cpp
+1
-1
src/BSD.h
+129
-23
src/c1908_vec.h
+0
-0
src/readme.md
+12
-2
src/top.h
+22
-5
src/write_vec.sh
+19
-0
src/zstart.sh
+1
-0
No files found.
src/BSD.cpp
View file @
7889538b
...
...
@@ -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
;
...
...
src/BSD.h
View file @
7889538b
...
...
@@ -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
++
){
...
...
src/c1908_vec.h
0 → 100644
View file @
7889538b
This diff is collapsed.
Click to expand it.
src/readme.md
View file @
7889538b
...
...
@@ -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;
...
...
src/top.h
View file @
7889538b
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
=
10
0
;
//测试要求多少样本
extern
const
int
parameter_max_samples
=
int
(
parameter_test_ios
*
20
);
//BSD每一个节点最多进行多少次采样
int
parameter_test_ios
=
10
24
;
//测试要求多少样本
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
;
}
src/write_vec.sh
0 → 100644
View file @
7889538b
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"
\
src/zstart.sh
View file @
7889538b
...
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment