Skip to content
Snippets Groups Projects
Commit 85e4b214 authored by Yaman Umuroglu's avatar Yaman Umuroglu
Browse files

[Checksum] make checksum work with cppsim

some additional surgery was needed to get the checksum value out
parent 508dd37a
No related branches found
No related tags found
No related merge requests found
...@@ -124,6 +124,9 @@ class checksum(HLSCustomOp): ...@@ -124,6 +124,9 @@ class checksum(HLSCustomOp):
return normal_ishape return normal_ishape
def get_ap_int_max_w(self):
return max(super().get_ap_int_max_w(), 32)
def get_normal_output_shape(self): def get_normal_output_shape(self):
# same shape as input # same shape as input
return self.get_normal_input_shape() return self.get_normal_input_shape()
...@@ -132,11 +135,17 @@ class checksum(HLSCustomOp): ...@@ -132,11 +135,17 @@ class checksum(HLSCustomOp):
folded_oshape = self.get_folded_output_shape() folded_oshape = self.get_folded_output_shape()
return np.prod(folded_oshape[:-1]) return np.prod(folded_oshape[:-1])
def npy_to_dynamic_output(self, context):
super().npy_to_dynamic_output(context)
node = self.onnx_node
code_gen_dir = self.get_nodeattr("code_gen_dir_cppsim")
output_checksum = np.load("{}/output_checksum.npy".format(code_gen_dir))
context[node.output[1]] = output_checksum
def execute_node(self, context, graph): def execute_node(self, context, graph):
mode = self.get_nodeattr("exec_mode") mode = self.get_nodeattr("exec_mode")
node = self.onnx_node node = self.onnx_node
inp = context[node.input[0]] inp = context[node.input[0]]
exp_shape = self.get_normal_input_shape()
# TODO ensure codegen dir exists # TODO ensure codegen dir exists
if mode == "cppsim": if mode == "cppsim":
...@@ -152,9 +161,9 @@ class checksum(HLSCustomOp): ...@@ -152,9 +161,9 @@ class checksum(HLSCustomOp):
) )
if mode == "cppsim": if mode == "cppsim":
output = inp self.dynamic_input_to_npy(context, 1)
output = np.asarray([output], dtype=np.float32).reshape(*exp_shape) self.exec_precompiled_singlenode_model()
context[node.output[0]] = output self.npy_to_dynamic_output(context)
elif mode == "rtlsim": elif mode == "rtlsim":
# create a npy file for the input of the node # create a npy file for the input of the node
assert ( assert (
...@@ -221,10 +230,30 @@ class checksum(HLSCustomOp): ...@@ -221,10 +230,30 @@ class checksum(HLSCustomOp):
self.code_gen_dict["$DEFINES$"] = my_defines self.code_gen_dict["$DEFINES$"] = my_defines
def read_npy_data(self): def read_npy_data(self):
pass code_gen_dir = self.get_nodeattr("code_gen_dir_cppsim")
dtype = self.get_input_datatype()
elem_bits = dtype.bitwidth()
packed_bits = self.get_instream_width()
packed_hls_type = "ap_uint<%d>" % packed_bits
elem_hls_type = dtype.get_hls_datatype_str()
npy_type = "float"
npy_in = "%s/input_0.npy" % code_gen_dir
self.code_gen_dict["$READNPYDATA$"] = []
# note: the innermost dim is reversed for the input
self.code_gen_dict["$READNPYDATA$"].append(
'npy2apintstream<%s, %s, %d, %s>("%s", in0, false);'
% (packed_hls_type, elem_hls_type, elem_bits, npy_type, npy_in)
)
def strm_decl(self): def strm_decl(self):
pass self.code_gen_dict["$STREAMDECLARATIONS$"] = []
self.code_gen_dict["$STREAMDECLARATIONS$"].append(
'hls::stream<ap_uint<{}>> in0 ("in0");'.format(self.get_instream_width())
)
self.code_gen_dict["$STREAMDECLARATIONS$"].append(
'hls::stream<ap_uint<{}>> out ("out");'.format(self.get_outstream_width())
)
self.code_gen_dict["$STREAMDECLARATIONS$"].append("ap_uint<32> chk;")
def docompute(self): def docompute(self):
self.code_gen_dict["$DOCOMPUTE$"] = [ self.code_gen_dict["$DOCOMPUTE$"] = [
...@@ -232,10 +261,39 @@ class checksum(HLSCustomOp): ...@@ -232,10 +261,39 @@ class checksum(HLSCustomOp):
] ]
def dataoutstrm(self): def dataoutstrm(self):
pass code_gen_dir = self.get_nodeattr("code_gen_dir_cppsim")
dtype = self.get_output_datatype()
if dtype == DataType["BIPOLAR"]:
# use binary for bipolar storage
dtype = DataType["BINARY"]
elem_bits = dtype.bitwidth()
packed_bits = self.get_outstream_width()
packed_hls_type = "ap_uint<%d>" % packed_bits
elem_hls_type = dtype.get_hls_datatype_str()
npy_type = "float"
npy_out = "%s/output.npy" % code_gen_dir
shape = tuple(self.get_folded_output_shape())
shape_cpp_str = str(shape).replace("(", "{").replace(")", "}")
# note: the innermost dim is not reversed for the output
self.code_gen_dict["$DATAOUTSTREAM$"] = [
'apintstream2npy<%s, %s, %d, %s>(out, %s, "%s", false);'
% (
packed_hls_type,
elem_hls_type,
elem_bits,
npy_type,
shape_cpp_str,
npy_out,
),
"std::vector<unsigned int> checksum(1);",
"checksum[0] = chk;",
'cnpy::npy_save("%s/output_checksum.npy",&checksum[0],{1},"w");'
% code_gen_dir,
]
def save_as_npy(self): def save_as_npy(self):
pass self.code_gen_dict["$SAVEASCNPY$"] = []
def blackboxfunction(self): def blackboxfunction(self):
self.code_gen_dict["$BLACKBOXFUNCTION$"] = [ self.code_gen_dict["$BLACKBOXFUNCTION$"] = [
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment