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
9aee67a1
Commit
9aee67a1
authored
Dec 10, 2025
by
chengshuyao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Now partition searching is kind of effective
parent
f4c821d4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
79 additions
and
41 deletions
+79
-41
src/BSD.cpp
+2
-2
src/BSD.h
+54
-30
src/BSD_top.h
+0
-0
src/next_layer_bit.h
+4
-4
src/print_circuit.h
+18
-4
src/top.h
+1
-1
No files found.
src/BSD.cpp
View file @
9aee67a1
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
int
main
(
int
argc
,
char
*
argv
[]){
int
main
(
int
argc
,
char
*
argv
[]){
set_default
();
set_default
();
int
area_a
=
search_order
();
//
int area_a = search_order();
//search_partition(parameter_input_bit_width,start_order
);
search_partition
(
);
};
};
src/BSD.h
View file @
9aee67a1
...
@@ -92,7 +92,7 @@ public:
...
@@ -92,7 +92,7 @@ public:
uint64_t
io_generator_single_vec
(
uint64_t
*
input_data
,
int
which_bit_output
);
uint64_t
io_generator_single_vec
(
uint64_t
*
input_data
,
int
which_bit_output
);
int
set_random_input_data
(
bool
**
mask_input_data
);
int
set_random_input_data
(
bool
**
mask_input_data
);
int
mask_random_input_data
(
int
depth
,
bool
*
mask
,
int
amount
,
int
*
most_influence
,
bool
**
mask_input_data
);
int
mask_random_input_data
(
int
depth
,
bool
*
mask
,
int
amount
,
int
*
most_influence
,
bool
**
mask_input_data
);
int
next_bit_layer
(
int
depth
,
int
order_num
);
int
next_bit_layer
(
int
depth
);
int
next_bit_layer_0
(
int
depth
);
int
next_bit_layer_0
(
int
depth
);
int
next_bit_layer_1
(
int
depth
);
int
next_bit_layer_1
(
int
depth
);
int
next_bit_layer_old
(
int
depth
);
int
next_bit_layer_old
(
int
depth
);
...
@@ -128,7 +128,7 @@ public:
...
@@ -128,7 +128,7 @@ public:
int
BDD_infer
(
BDD_node
**
BDD
,
int
*
most_influence
);
int
BDD_infer
(
BDD_node
**
BDD
,
int
*
most_influence
);
int
print_circuit
(
BDD_node
**
BDD
,
int
*
most_influence
);
int
print_circuit
(
BDD_node
**
BDD
,
int
*
most_influence
,
int
node_depth
,
char
*
start_node_index_string
);
int
BDD_FULL_PROCESS
();
int
BDD_FULL_PROCESS
();
bool
*
left_son_mask
;
bool
*
left_son_mask
;
...
@@ -155,13 +155,16 @@ public:
...
@@ -155,13 +155,16 @@ public:
int
BSD_samples_train_each_layer
();
int
BSD_samples_train_each_layer
();
int
BSD_samples_sort_each_layer
();
int
BSD_samples_sort_each_layer
();
int
*
*
BSD_variable_order
;
int
*
BSD_variable_order
;
int
BSD_variable_order_number
;
int
BSD_variable_order_number
;
int
feature_area
;
int
feature_area
;
int
*
split_nodes_each_layer
;
int
*
split_nodes_each_layer
;
int
*
accuracy_each_layer
;
int
*
accuracy_each_layer
;
bool
*
output_partition_set
;
bool
*
output_partition_set
;
node_index
*
start_node_index
;
char
*
start_node_index_string
;
//huanglue
//huanglue
void
BSD_switch_layer
(
int
i
);
void
BSD_switch_layer
(
int
i
);
int
*
BDD_split_nodes_each_layer
=
nullptr
;
int
*
BDD_split_nodes_each_layer
=
nullptr
;
...
@@ -194,9 +197,11 @@ public:
...
@@ -194,9 +197,11 @@ public:
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
];
BSD_variable_order
=
new
int
*
[
parameter_max_orders
];
BSD_variable_order
=
new
int
[
parameter_input_bit_width
+
1
];
BDD_split_nodes_each_layer
=
new
int
[
parameter_input_bit_width
+
1
];
BDD_split_nodes_each_layer
=
new
int
[
parameter_input_bit_width
+
1
];
output_partition_set
=
new
bool
[
parameter_output_bit_width
];
output_partition_set
=
new
bool
[
parameter_output_bit_width
];
start_node_index
=
new
node_index
[
parameter_output_bit_width
];
start_node_index_string
=
new
char
[
parameter_output_bit_width
];
};
};
//~BDD_class(){
//~BDD_class(){
...
@@ -248,22 +253,26 @@ int BDD_class::BSD_samples_sort_each_layer(){
...
@@ -248,22 +253,26 @@ int BDD_class::BSD_samples_sort_each_layer(){
bool
BDD_class
::
io_generator_single
(
bool
*
input_data
,
int
which_bit_output
){
bool
BDD_class
::
io_generator_single
(
bool
*
input_data
,
int
which_bit_output
){
int
origin_which_bit_output
=
this
->
start_node_index
[
which_bit_output
].
root_node_index
;
for
(
int
i
=
0
;
i
<
this
->
start_node_index
[
which_bit_output
].
node_depth
;
i
++
){
input_data
[
this
->
start_node_index
[
which_bit_output
].
expand_input_bit_index
[
i
]]
=
this
->
start_node_index
[
which_bit_output
].
expand_input_bit_data
[
i
];
}
#ifdef SINGLE_BITS
#ifdef SINGLE_BITS
if
(
output_partition_set
[
which_bit_output
]
==
1
){
//
if (output_partition_set[which_bit_output]==1){
bool
output_bit_s
=
io_generator_outer_single
(
input_data
,
which_bit_output
)
;
bool
output_bit_s
=
io_generator_outer_single
(
input_data
,
origin_
which_bit_output
)
;
return
output_bit_s
;
return
output_bit_s
;
}
else
{
//
}else{
return
0
;
//
return 0;
}
//
}
#else
#else
bool
output_bit
;
bool
output_bit
;
bool
*
output_bits
=
new
bool
[
parameter_output_bit_width
];
bool
*
output_bits
=
new
bool
[
parameter_output_bit_width
];
if
(
output_partition_set
[
which_bit_output
]
==
1
){
//
if (output_partition_set[which_bit_output]==1){
output_bits
=
io_generator_function
(
input_data
,
output_bits
);
output_bits
=
io_generator_function
(
input_data
,
output_bits
);
output_bit
=
output_bits
[
which_bit_output
]
;
output_bit
=
output_bits
[
which_bit_output
]
;
}
//
}
else
//
else
output_bit
=
0
;
//
output_bit = 0;
delete
[]
output_bits
;
delete
[]
output_bits
;
return
output_bit
;
return
output_bit
;
#endif
#endif
...
@@ -272,21 +281,28 @@ bool BDD_class::io_generator_single(bool* input_data,int which_bit_output){
...
@@ -272,21 +281,28 @@ bool BDD_class::io_generator_single(bool* input_data,int which_bit_output){
uint64_t
BDD_class
::
io_generator_single_vec
(
uint64_t
*
input_data
,
int
which_bit_output
){
uint64_t
BDD_class
::
io_generator_single_vec
(
uint64_t
*
input_data
,
int
which_bit_output
){
int
origin_which_bit_output
=
this
->
start_node_index
[
which_bit_output
].
root_node_index
;
for
(
int
i
=
0
;
i
<
this
->
start_node_index
[
which_bit_output
].
node_depth
;
i
++
){
if
(
this
->
start_node_index
[
which_bit_output
].
expand_input_bit_data
[
i
]
==
0
)
input_data
[
this
->
start_node_index
[
which_bit_output
].
expand_input_bit_index
[
i
]]
=
uint64_t
(
0
);
else
input_data
[
this
->
start_node_index
[
which_bit_output
].
expand_input_bit_index
[
i
]]
=
~
uint64_t
(
0
);
}
#ifdef SINGLE_BITS
#ifdef SINGLE_BITS
if
(
output_partition_set
[
which_bit_output
]
==
1
){
//
if (output_partition_set[which_bit_output]==1){
uint64_t
output_bit_s
=
io_generator_outer_vec_single
(
input_data
,
which_bit_output
)
;
uint64_t
output_bit_s
=
io_generator_outer_vec_single
(
input_data
,
origin_
which_bit_output
)
;
return
output_bit_s
;
return
output_bit_s
;
}
else
//
}else
return
0
;
//
return 0;
#else
#else
uint64_t
output_bit
;
uint64_t
output_bit
;
uint64_t
*
output_bits
=
new
uint64_t
[
parameter_output_bit_width
];
uint64_t
*
output_bits
=
new
uint64_t
[
parameter_output_bit_width
];
if
(
output_partition_set
[
which_bit_output
]
==
1
){
//
if (output_partition_set[which_bit_output]==1){
output_bits
=
io_generator_function_vec
(
input_data
,
output_bits
);
output_bits
=
io_generator_function_vec
(
input_data
,
output_bits
);
output_bit
=
output_bits
[
which_bit_output
]
;
output_bit
=
output_bits
[
which_bit_output
]
;
}
//
}
else
//
else
output_bit
=
0
;
//
output_bit = 0;
delete
[]
output_bits
;
delete
[]
output_bits
;
return
output_bit
;
return
output_bit
;
#endif
#endif
...
@@ -406,7 +422,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
...
@@ -406,7 +422,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
for
(
int
zj
=
0
;
zj
<
parameter_input_bit_width
+
1
;
zj
++
){
for
(
int
zj
=
0
;
zj
<
parameter_input_bit_width
+
1
;
zj
++
){
BDD_partition
[
zi
].
has_been_unfold
[
zj
]
=
has_been_unfold
[
zj
];
BDD_partition
[
zi
].
has_been_unfold
[
zj
]
=
has_been_unfold
[
zj
];
BDD_partition
[
zi
].
most_influence
[
zj
]
=
most_influence
[
zj
];
BDD_partition
[
zi
].
most_influence
[
zj
]
=
most_influence
[
zj
];
BDD_partition
[
zi
].
BSD_variable_order
[
0
][
zj
]
=
BSD_variable_order
[
zi
+
1
]
[
zj
];
BDD_partition
[
zi
].
BSD_variable_order
[
zj
]
=
BSD_variable_order
[
zj
];
}
}
for
(
int
zj
=
0
;
zj
<
BDD_partition
[
zi
].
how_many_start_nodes
;
zj
++
){
for
(
int
zj
=
0
;
zj
<
BDD_partition
[
zi
].
how_many_start_nodes
;
zj
++
){
if
(
partition_index
[
zi
][
zj
]
<
BDD_width_each_layer
[
i
]){
if
(
partition_index
[
zi
][
zj
]
<
BDD_width_each_layer
[
i
]){
...
@@ -473,9 +489,6 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
...
@@ -473,9 +489,6 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
delete
[]
split_nodes_each_layer
;
delete
[]
split_nodes_each_layer
;
delete
[]
accuracy_each_layer
;
delete
[]
accuracy_each_layer
;
for
(
int
zj
=
0
;
zj
<
parameter_max_orders
;
zj
++
){
delete
[]
BSD_variable_order
[
zj
]
;
}
delete
[]
BSD_variable_order
;
delete
[]
BSD_variable_order
;
for
(
zi
=
0
;
zi
<
partition_into_how_many_parts
;
zi
++
){
for
(
zi
=
0
;
zi
<
partition_into_how_many_parts
;
zi
++
){
...
@@ -511,7 +524,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
...
@@ -511,7 +524,7 @@ int BDD_class::train_BDD(BDD_node** BDD,int* most_influence,int start_depth, int
BDD
[
i
+
1
][
zi
].
non_equal_number
=
0
;
BDD
[
i
+
1
][
zi
].
non_equal_number
=
0
;
}
}
BSD_samples
=
BSD_samples_sort
;
BSD_samples
=
BSD_samples_sort
;
most_influence
[
i
]
=
next_bit_layer
(
i
,
order_num
);
most_influence
[
i
]
=
next_bit_layer
(
i
);
BSD_samples
=
int
(
BSD_samples_train
/
63
)
*
63
;
//一定要是vec_length的整数倍
BSD_samples
=
int
(
BSD_samples_train
/
63
)
*
63
;
//一定要是vec_length的整数倍
cout
<<
BSD_samples
<<
endl
;
cout
<<
BSD_samples
<<
endl
;
...
@@ -1246,6 +1259,17 @@ int BDD_class::BDD_FULL_PROCESS(){
...
@@ -1246,6 +1259,17 @@ int BDD_class::BDD_FULL_PROCESS(){
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
];
}
}
int
start_node_ij
=
0
;
for
(
int
i
=
0
;
i
<
parameter_output_bit_width
;
i
++
){
if
(
i
==
start_node_index
[
start_node_ij
].
root_node_index
){
start_node_index_string
[
i
]
=
'1'
;
start_node_ij
++
;
}
else
{
start_node_index_string
[
i
]
=
'0'
;
}
}
// 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];
// }
// }
...
@@ -1370,12 +1394,12 @@ int BDD_class::BDD_FULL_PROCESS(){
...
@@ -1370,12 +1394,12 @@ int BDD_class::BDD_FULL_PROCESS(){
//cout<<"Start infer"<<endl;
//cout<<"Start infer"<<endl;
//BDD_infer(BDD,most_influence);
//BDD_infer(BDD,most_influence);
print_circuit
(
BDD
,
most_influence
);
//
print_circuit(BDD,most_influence);
if
(
circuit_accuracy
==
1
)
if
(
circuit_accuracy
>
0
.
9999
)
print_circuit
(
BDD
,
most_influence
);
print_circuit
(
BDD
,
most_influence
,
start_depth
,
start_node_index_string
);
delete
[]
test_input_data
;
delete
[]
test_input_data
;
for
(
int
vi
=
0
;
vi
<
parameter_input_bit_width
;
vi
++
){
for
(
int
vi
=
0
;
vi
<
parameter_input_bit_width
;
vi
++
){
BSD_variable_order
[
0
][
vi
]
=
most_influence
[
vi
];
BSD_variable_order
[
vi
]
=
most_influence
[
vi
];
}
}
//GLOBAL_BDD_nodes += total_nodes_amount;
//GLOBAL_BDD_nodes += total_nodes_amount;
//GLOBAL_BDD_split_nodes += total_split_nodes;
//GLOBAL_BDD_split_nodes += total_split_nodes;
...
...
src/BSD_top.h
View file @
9aee67a1
This diff is collapsed.
Click to expand it.
src/next_layer_bit.h
View file @
9aee67a1
...
@@ -117,15 +117,15 @@ int BDD_class::next_bit_layer_single(int depth,int which_node_this_layer){
...
@@ -117,15 +117,15 @@ int BDD_class::next_bit_layer_single(int depth,int which_node_this_layer){
};
};
int
BDD_class
::
next_bit_layer
(
int
depth
,
int
order_num
){
int
BDD_class
::
next_bit_layer
(
int
depth
){
//cout<<"Depth: "<<depth<<" Order num: "<<BSD_variable_order_number<<endl;
//cout<<"Depth: "<<depth<<" Order num: "<<BSD_variable_order_number<<endl;
if
((
depth
<
BSD_variable_order_number
)
){
if
((
depth
<
BSD_variable_order_number
)
){
for
(
int
i
=
depth
;
i
<
BSD_variable_order_number
;
i
++
){
for
(
int
i
=
depth
;
i
<
BSD_variable_order_number
;
i
++
){
if
(
!
has_been_unfold
[
BSD_variable_order
[
order_num
][
depth
]]){
if
(
!
has_been_unfold
[
BSD_variable_order
[
depth
]]){
most_influence
[
depth
]
=
BSD_variable_order
[
order_num
][
depth
];
most_influence
[
depth
]
=
BSD_variable_order
[
depth
];
has_been_unfold
[
most_influence
[
depth
]]
=
1
;
has_been_unfold
[
most_influence
[
depth
]]
=
1
;
cout
<<
most_influence
[
depth
]
<<
endl
;
cout
<<
most_influence
[
depth
]
<<
endl
;
return
BSD_variable_order
[
order_num
][
depth
];
return
BSD_variable_order
[
depth
];
}
}
else
{
else
{
;
;
...
...
src/print_circuit.h
View file @
9aee67a1
int
BDD_class
::
print_circuit
(
BDD_node
**
BDD
,
int
*
most_influence
){
int
BDD_class
::
print_circuit
(
BDD_node
**
BDD
,
int
*
most_influence
,
int
node_depth
,
char
*
start_node_index_string
){
int
i
,
j
;
int
i
,
j
;
int
zi
;
int
zi
;
char
output_file_name
[
100
];
char
output_file_name
[
100
];
//sprintf(output_file_name,"rtl/module_output_bit_%d.v",which_bit_output);
//sprintf(output_file_name,"rtl/module_output_bit_%d.v",which_bit_output);
sprintf
(
output_file_name
,
"rtl/function_%d_id_%d.v"
,
circuit_index
,
BDD_id
);
// sprintf(output_file_name,"rtl/function_%d_id_%d.v",circuit_index,BDD_id);
sprintf
(
output_file_name
,
"rtl/function_layer_%d_nodes_%s.v"
,
node_depth
,
start_node_index_string
);
// string output_file_name << output_file_name_begin << which_bit_output << output_file_name_end;
// string output_file_name << output_file_name_begin << which_bit_output << output_file_name_end;
...
@@ -134,9 +135,22 @@ int BDD_class::print_circuit(BDD_node** BDD,int* most_influence){
...
@@ -134,9 +135,22 @@ int BDD_class::print_circuit(BDD_node** BDD,int* most_influence){
output_module_file
<<
"//total BDD nodes recursive = "
<<
total_nodes_amount_recursive
<<
endl
;
output_module_file
<<
"//total BDD nodes recursive = "
<<
total_nodes_amount_recursive
<<
endl
;
output_module_file
<<
"//total split modes recursive = "
<<
total_split_nodes_recursive
<<
endl
;
output_module_file
<<
"//total split modes recursive = "
<<
total_split_nodes_recursive
<<
endl
;
output_module_file
<<
"//train time = "
<<
train_time
<<
endl
;
output_module_file
<<
"//train time = "
<<
train_time
<<
endl
;
output_module_file
<<
"module function_"
<<
circuit_index
<<
"_BDD_id_"
<<
BDD_id
<<
" (i,o);"
<<
endl
<<
endl
;
// output_module_file << "module function_"<<circuit_index<<"_BDD_id_"<<BDD_id<<" (i,o);"<<endl<<endl;
output_module_file
<<
"module function_layer_"
<<
node_depth
<<
"_nodes_"
<<
start_node_index_string
<<
" (i,o_index);"
<<
endl
<<
endl
;
output_module_file
<<
"input ["
<<
parameter_input_bit_width
-
1
<<
":0] i;"
<<
endl
;
output_module_file
<<
"input ["
<<
parameter_input_bit_width
-
1
<<
":0] i;"
<<
endl
;
output_module_file
<<
"output ["
<<
how_many_start_nodes
-
1
<<
":0] o;"
<<
endl
<<
endl
;
output_module_file
<<
"output ["
<<
parameter_output_bit_width
-
1
<<
":0] o_index;"
<<
endl
<<
endl
;
output_module_file
<<
"wire ["
<<
how_many_start_nodes
-
1
<<
":0] o;"
<<
endl
<<
endl
;
int
ij
=
0
;
for
(
int
i
=
0
;
i
<
parameter_output_bit_width
;
i
++
){
if
(
start_node_index_string
[
i
]
==
'1'
){
output_module_file
<<
"assign o_index["
<<
i
<<
"] = o["
<<
ij
<<
"];"
<<
endl
;
ij
++
;
}
}
output_module_file
<<
endl
;
if
(
partition_depth
==
total_BDD_depth
){
if
(
partition_depth
==
total_BDD_depth
){
for
(
i
=
0
;
i
<
total_BDD_depth
+
1
;
i
++
){
for
(
i
=
0
;
i
<
total_BDD_depth
+
1
;
i
++
){
...
...
src/top.h
View file @
9aee67a1
...
@@ -11,7 +11,7 @@ int parameter_output_bit_width = PO_WIDTH;
...
@@ -11,7 +11,7 @@ int parameter_output_bit_width = PO_WIDTH;
extern
const
int
parameter_search_iterations
=
10
;
//最大设计次数
extern
const
int
parameter_search_iterations
=
10
;
//最大设计次数
extern
const
int
parameter_test_ios
=
10000
00
;
//测试要求多少样本
extern
const
int
parameter_test_ios
=
10000
;
//测试要求多少样本
extern
const
int
parameter_max_samples
=
64
*
100
;
//BSD每一个节点最多进行多少次采样,至少为64
extern
const
int
parameter_max_samples
=
64
*
100
;
//BSD每一个节点最多进行多少次采样,至少为64
extern
const
double
parameter_early_stop_accuracy
=
1
;
//允许的错误率,如果完全不允许,设为1;
extern
const
double
parameter_early_stop_accuracy
=
1
;
//允许的错误率,如果完全不允许,设为1;
//没有特殊需要不要设到<1,会慢一些。
//没有特殊需要不要设到<1,会慢一些。
...
...
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