diff options
Diffstat (limited to 'modexpng_fpga_model.py')
-rw-r--r-- | modexpng_fpga_model.py | 61 |
1 files changed, 54 insertions, 7 deletions
diff --git a/modexpng_fpga_model.py b/modexpng_fpga_model.py index 54db95f..d3b7841 100644 --- a/modexpng_fpga_model.py +++ b/modexpng_fpga_model.py @@ -71,6 +71,15 @@ _VECTOR_PATH = "/vector" _VECTOR_CLASS = "Vector" +# ------------------ +# Debugging Settings +# ------------------ +DUMP_VECTORS = False +DUMP_INDICES = False +DUMP_MACS_CLEARING = False +DUMP_MACS_ACCUMULATION = True + + # # Multi-Precision Integer # @@ -94,6 +103,15 @@ class ModExpNG_Operand(): self._init_from_words(words, length) + def format_verilog_concat(self, name): + + for i in range(len(self.words)): + if i > 0: + if (i % 4) == 0: print("") + else: print(" ", end='') + print("%s[%2d] = 17'h%05x;" % (name, i, self.words[i]), end='') + print("") + def _init_from_words(self, words, count): for i in range(count): @@ -315,14 +333,17 @@ class ModExpNG_WordMultiplier(): def _rotate_indices(self, num_words): for x in range(len(self._indices)): - self._indices[x] -= 1 - if self._indices[x] < 0: - self._indices[x] += num_words + if self._indices[x] > 0: + self._indices[x] -= 1 + else: + self._indices[x] = num_words - 1 def _rotate_index_aux(self): self._index_aux[0] -= 1 - def multiply_square(self, a_wide, b_narrow, ab_num_words): + def multiply_square(self, a_wide, b_narrow, ab_num_words, dump=False): + + if dump: print("multiply_square()") num_cols = ab_num_words // NUM_MULTS @@ -335,8 +356,17 @@ class ModExpNG_WordMultiplier(): self._clear_all_macs() self._preset_indices(col) + if dump and DUMP_MACS_CLEARING: + print("t= 0, col=%2d > clear > all" % (col)) + for t in range(ab_num_words): + if dump and DUMP_INDICES: + print("t=%2d, col=%2d > indices:" % (t, col), end='') + for i in range(NUM_MULTS): + print(" %2d" % self._indices[i], end='') + print("") + # current b-word bt = b_narrow.words[t] @@ -348,6 +378,16 @@ class ModExpNG_WordMultiplier(): if t == (col * NUM_MULTS + x): parts[t] = self._macs[x] self._clear_one_mac(x) + if dump and DUMP_MACS_CLEARING: + print("t=%2d, col=%2d > clear > x=%d:" % (t, col, x)) + + if dump and DUMP_MACS_ACCUMULATION: + for i in range(NUM_MULTS): + if i > 0: print(" | ", end='') + print("[%d]: 0x%012x" % (i, self._macs[i]), end='') + print("") + + # save the uppers part of product at end of column, # for the last column don't save the very last part @@ -570,13 +610,20 @@ class ModExpNG_Worker(): return ModExpNG_Operand(None, 2*ab_num_words, ab) - def multiply(self, a, b, n, n_coeff, ab_num_words, reduce_only=False, multiply_only=False): + def multiply(self, a, b, n, n_coeff, ab_num_words, reduce_only=False, multiply_only=False, dump=False): + + if dump and DUMP_VECTORS: + print("num_words = %d" % ab_num_words) + a.format_verilog_concat("A") + b.format_verilog_concat("B") + n.format_verilog_concat("N") + n_coeff.format_verilog_concat("N_COEFF") # 1. if reduce_only: ab = a else: - ab_parts = self.multiplier.multiply_square(a, b, ab_num_words) + ab_parts = self.multiplier.multiply_square(a, b, ab_num_words, dump) ab_words = self.recombinator.recombine_square(ab_parts, ab_num_words) ab = ModExpNG_Operand(None, 2 * ab_num_words, ab_words) @@ -678,7 +725,7 @@ if __name__ == "__main__": mp_blind = worker.multiply(mp_blind_inverse_factor, vector.p_factor, vector.p, vector.p_coeff, pq_num_words) mq_blind = worker.multiply(mq_blind_inverse_factor, vector.q_factor, vector.q, vector.q_coeff, pq_num_words) - mp_blind_factor = worker.multiply(mp_blind, vector.p_factor, vector.p, vector.p_coeff, pq_num_words) + mp_blind_factor = worker.multiply(mp_blind, vector.p_factor, vector.p, vector.p_coeff, pq_num_words, dump=True) mq_blind_factor = worker.multiply(mq_blind, vector.q_factor, vector.q, vector.q_coeff, pq_num_words) sp_blind_factor = worker.exponentiate(ip_factor, mp_blind_factor, vector.dp, vector.p, vector.p_factor, vector.p_coeff, pq_num_words) |