+# ONLY NEEDED FOR DEBUG - MAKE SURE TAP DRIVER FUNCTIONS CORRECT FIRST!
+def swap_bit_order(word, wordlen):
+ rev_word = 0
+ for i in range(wordlen):
+ rev_word += ((word >> i) & 0x1) << (wordlen-1-i)
+
+ num_bit_format = "{:0" + str(wordlen) + "b}"
+ print_str = "Orig:" + num_bit_format + " | Bit Swapped:" + num_bit_format
+ print(print_str.format(word, rev_word))
+
+ return rev_word
+
+def jtag_unit_test(dut, bs_type, is_io_set, bsdata, exp_pads, exp_tdo):
+ bslen = len(dut.jtag.ios) #* 2
+ print("Chain len based on jtag.ios: {}".format(bslen))
+ if bs_type == BS_EXTEST:
+ print("Sending TDI data with core/pads disconnected")
+ elif bs_type == BS_SAMPLE:
+ print("Sending TDI data with core/pads connected")
+ else:
+ raise Exception("Unsupported BS chain mode!")
+
+ if is_io_set:
+ print("All pad inputs/core outputs set, bs data: {0:b}"
+ .format(bsdata))
+ else:
+ print("All pad inputs/core outputs reset, bs data: {0:b}"
+ .format(bsdata))
+
+ result = yield from jtag_read_write_reg(dut.jtag, bs_type, bslen, bsdata)
+ if bs_type == BS_EXTEST:
+ # TDO is only outputting previous BS chain data, must configure to
+ # output BS chain to the main shift register
+
+ # Previous test may not have been EXTEST, need to switch over
+ yield from jtag_set_shift_dr(dut.jtag)
+ result = yield from tms_data_getset(dut.jtag, bs_type, bslen, bsdata)
+ yield from jtag_set_idle(dut.jtag)
+
+ # TODO: make format based on bslen, not a magic number 20-bits wide
+ print("TDI BS Data: {0:020b}, Data Length (bits): {1}"
+ .format(bsdata, bslen))
+ print("TDO BS Data: {0:020b}".format(result))
+ yield from check_ios_keys(dut, result, exp_pads, exp_tdo)
+
+ #yield # testing extra clock
+ # Reset shift register between tests
+ yield from jtag_set_reset(dut.jtag)
+
+def check_ios_keys(dut, tdo_data, test_vector, exp_tdo):
+ print("Checking ios signals with TDO and given test vectors")
+ bslen = len(dut.jtag.ios)
+ ios_keys = list(dut.jtag.ios.keys())
+ print(" ios Signals | From TDO | --- | ----")
+ print("Side|Exp|Seen | Side|Exp|Seen | I/O | Name")
+ for i in range(0, bslen):
+ signal = ios_keys[i]
+ exp_pad_val = (test_vector >> i) & 0b1
+ exp_tdo_val = (exp_tdo >> i) & 0b1
+ tdo_value = (tdo_data >> i) & 0b1
+ # Only observed signals so far are outputs...
+ # TODO: Cleanup!
+ if check_if_signal_output(ios_keys[i]):
+ temp_result = yield dut.jtag.boundary_scan_pads[signal]['o']
+ print("Pad |{0:3b}|{1:4b} | Core|{2:3b}|{3:4b} | o | {4}"
+ .format(exp_pad_val, temp_result, exp_tdo_val, tdo_value, signal))
+ # ...or inputs
+ elif check_if_signal_input(ios_keys[i]):
+ temp_result = yield dut.jtag.boundary_scan_pads[signal]['i']
+ print("Pad |{0:3b}|{1:4b} | Pad |{2:3b}|{3:4b} | i | {4}"
+ .format(exp_pad_val, temp_result, exp_tdo_val, tdo_value, signal))
+ else:
+ raise Exception("Signal in JTAG ios dict: " + signal
+ + " cannot be determined as input or output!")
+ assert temp_result == exp_pad_val
+ assert tdo_value == exp_tdo_val
+
+# TODO: may need to expand to support further signals contained in the
+# JTAG module ios dictionary!
+
+
+def check_if_signal_output(signal_str):
+ if ('__o' in signal_str) or ('__tx' in signal_str):
+ return True
+ else:
+ return False
+
+
+def check_if_signal_input(signal_str):
+ if ('__i' in signal_str) or ('__rx' in signal_str):
+ return True
+ else:
+ return False
+
+
+def produce_ios_mask(dut, is_i=False, is_o=True, is_oe=False):
+ if is_i and not(is_o) and not(is_oe):
+ mask_type = "input"
+ elif not(is_i) and is_o:
+ mask_type = "output"
+ else:
+ mask_type = "i={:b} | o={:b} | oe={:b} ".format(is_i, is_o, is_oe)
+ print("Determine the", mask_type, "mask")
+ bslen = len(dut.jtag.ios)
+ ios_keys = list(dut.jtag.ios.keys())
+ mask = 0
+ for i in range(0, bslen):
+ signal = ios_keys[i]
+ if (('__o' in ios_keys[i]) or ('__tx' in ios_keys[i])):
+ if ('__oe' in ios_keys[i]):
+ if is_oe:
+ mask += (1 << i)
+ else:
+ if is_o:
+ mask += (1 << i)
+ else:
+ if is_i:
+ mask += (1 << i)
+ return mask
+
+
+def print_all_ios_keys(dut):
+ print("Print all ios keys")
+ bslen = len(dut.jtag.ios)
+ ios_keys = list(dut.jtag.ios.keys())
+ for i in range(0, bslen):
+ signal = ios_keys[i]
+ # Check if outputs are asserted
+ if ('__o' in ios_keys[i]) or ('__tx' in ios_keys[i]):
+ print("Pad Output | Name: ", signal)
+ else:
+ print("Pad Input | Name: ", signal)
+
+