1+ input_sliced : &input_sliced
2+ bits_per_value : {input: average_input_bits_per_slice}
3+ actions_scale : n_input_slices
4+
5+ weight_sliced : &weight_sliced
6+ # Weights now operating sliced; each slice is a subset of the bits of the full weight.
7+ bits_per_value : {weight: average_weight_bits_per_slice}
8+ # Each weight slice is a different action
9+ actions_scale : n_weight_slices
10+
11+ both_sliced : &both_sliced
12+ # Weights and inputs are both sliced; each slice is a subset of the bits of the full
13+ # value.
14+ bits_per_value : {input: average_input_bits_per_slice, weight: average_weight_bits_per_slice}
15+ # Each weight & input slice combo is a different action.
16+ actions_scale : n_input_slices * n_weight_slices
17+
18+ both_sliced_weight_slices_parallelized : &both_sliced_weight_slices_parallelized
19+ # Weights and inputs are both sliced; each slice is a subset of the bits of the full
20+ # value.
21+ bits_per_value : {input: average_input_bits_per_slice, weight: average_weight_bits_per_slice}
22+
23+ # Each weight & input slice combo is a different action.
24+ actions_scale : n_input_slices * n_weight_slices
25+
26+ # Hopefully the architecture already has all of its hardware instances defined and
27+ # already uses usage_scale to account for weight slices consuming more array
28+ # utilization. So they should process the weight slices in parallel, scaling the
29+ # latency by 1 / n_weight_slices.
30+ latency_scale : 1 / n_weight_slices
31+
32+ one_action_per_value : &one_action_per_value
33+ values_per_action : {All: 1}
34+
135cim_component_attributes : &cim_component_attributes
2- # These are for NeuroSim
36+ # These are for NeuroSim.
337 rows : array_wordlines
438 cols : array_bitlines
539 cols_active_at_once : array_parallel_outputs
@@ -17,7 +51,7 @@ cim_component_attributes: &cim_component_attributes
1751 n_adcs : n_adc_per_bank
1852 width : encoded_output_bits
1953
20- # These will be applied to the weight drivers
54+ # These will be applied to the weight drivers.
2155weight_drivers_attributes : &weight_drivers_attributes
2256 << : *cim_component_attributes
2357 rows : array_wordlines
@@ -33,19 +67,19 @@ weight_drivers_attributes: &weight_drivers_attributes
3367 read_pulse_width : 0 # Irrelevant for weight programming
3468
3569variables_global : &variables_global
36- weight_bits : weight.bits_per_value
37- input_bits : input.bits_per_value
38- output_bits : output.bits_per_value
70+ weight_bits : round( weight.bits_per_value)
71+ input_bits : round( input.bits_per_value)
72+ output_bits : round( output.bits_per_value)
3973 array_parallel_inputs : get_array_fanout_reuse_output(spec)
4074 array_parallel_outputs : get_array_fanout_reuse_input(spec)
4175 array_parallel_weights : get_array_fanout_total(spec)
42- array_wordlines : array_parallel_inputs * cim_unit_width_cells
43- array_bitlines : array_parallel_outputs * cim_unit_depth_cells
76+ array_wordlines : array_parallel_inputs * cim_unit_depth_cells
77+ array_bitlines : array_parallel_outputs * cim_unit_width_cells
4478 dac_resolution : max(voltage_dac_resolution, temporal_dac_resolution)
4579 cols_active_at_once : array_parallel_outputs
4680
4781 # Calculate the number of slices needed to store the input and weight bits and
48- # the number of bits in each slice
82+ # the number of bits in each slice.
4983 in_b : encoded_input_bits # Shorthands so the following lines aren't super long
5084 w_b : encoded_weight_bits
5185 max_input_bits_per_slice : min(dac_resolution, in_b)
@@ -57,10 +91,10 @@ variables_global: &variables_global
5791 average_weight_bits_per_sliced_psum : encoded_weight_bits / n_sliced_psums
5892 average_output_bits_per_sliced_psum : encoded_output_bits / n_sliced_psums
5993
60- # This is for the bitwise-multiplication of the input and weight slices
94+ # This is for the bitwise-multiplication of the input and weight slices.
6195 n_virtual_macs : max_input_bits_per_slice * max_weight_bits_per_slice * encoded_output_bits
6296
63- # Calculate statistics for input and weight values and bits after encoding
97+ # Calculate statistics for input and weight values and bits after encoding.
6498 ehtas : encoded_hist_to_avg_slice # Shorthands so the following lines aren't super long
6599 in_enc_fn : input_encoding_func
66100 w_enc_fn : weight_encoding_func
0 commit comments