예제 #1
0
    def resp_handler(self, rvf: RVF):
        self.logger.debug(
            "JTAGNetwork.resp_handler(uid={:d}, command={:s}, payload={:s})\n".
            format(rvf.uid, rvf.command, str(rvf.payload)))
        self.response_mutex.acquire()
        self.response = rvf.payload
        self.response_mutex.release()
        i = 0
        start = 0
        end = 0
        seg = self.depth()
        while seg is not None:
            end = len(self.segments[i]) + end
            resp = RVF()
            resp.uid = seg.uid
            resp.payload = intbv(self.response[start:end])
            resp.command = rvf.command

            seg.client_interface.response(rvf)
            start = end
            i += 1
            seg = seg.breadth()
        self.request_count -= 1
        if self.request_count == 0:
            self.response_cv.notify(
            )  # Notify all requests have been satisfied
        SchedulerFactory.get_scheduler().clear_pending()
예제 #2
0
 def resp_handler(self, rvf: RVF):
     self.logger.debug(
         "ScanMux.resp_handler(uid={:d}, command={:s}, payload={:s})\n".
         format(rvf.uid, rvf.command, str(rvf.payload)))
     uid = rvf.uid
     resp = RVF()
     self.response_mutex.acquire()
     resp.payload = rvf.payload
     resp.command = rvf.command
     self.response_mutex.release()
     found = False
     seg = self.depth()
     while seg is not None:
         if seg == self.selected_seg:
             resp.uid = seg.uid
             seg.client_interface.response(resp)
             found = True
             break
         seg = seg.breadth()
     if not found:
         raise SchedulerError("Unable to locate selected_uid assembly.")
     self.request_count -= 1
     if self.request_count == 0:
         pass  # Notify all requests have been satisfied
     SchedulerFactory.get_scheduler().clear_pending()
예제 #3
0
 def apply(self):
     self.capture = False
     if not self.cached:
         self.__init_segments()
         self.cached = True
     seg = self.depth()
     while seg is not None:
         seg.apply()
         seg = seg.breadth()
     if self.pending:
         if self.data_mode is None:
             raise SchedulerError("Pending conflict with data_mode!")
         # Concatenate vectors together into a single vector to scan
         value = concat([v for v in self.segments])
         wrvf = RVF()
         if self.capture and self.data_mode:
             wrvf.command = "SDR"
         elif self.capture and not self.data_mode:
             wrvf.command = "SIR"
         elif self.data_mode:
             wrvf.command = "SDRNC"
         elif not self.data_mode:
             wrvf.command = "SIRNC"
         else:
             raise SchedulerError("Invalid data_mode detected.")
         wrvf.uid = self.uid
         wrvf.payload = value
         self.client_interface.request(wrvf)
         self.request_count += 1
         self.pending = False
         self.data_mode = None
         self.logger.debug(
             "JTAGNetwork.apply(uid={:d}, command={:s}, payload={:s})\n".
             format(wrvf.uid, wrvf.command, str(wrvf.payload)))
예제 #4
0
 def __send_response(self, uid, command, payload):
     resp = RVF()
     resp.payload = payload
     resp.command = command
     resp.uid = uid
     found = False
     seg = self.depth()
     while seg is not None:
         if uid == seg.uid:
             seg.client_interface.reponse(resp)
             found = True
             break
         seg = seg.breadth()
     if not found:
         raise SchedulerError("Unable to locate uid assembly.")
예제 #5
0
 def resp_handler(self, rvf: RVF):
     self.logger.debug(
         "PortalRegister.resp_handler(uid={:d}, command={:s}, payload={:s})\n"
         .format(rvf.uid, rvf.command, str(rvf.payload)))
     resp = RVF()
     self.local_access_mutex.acquire()
     resp.uid = self.current_uid
     self.local_access_mutex.release()
     resp.payload = rvf.payload
     if rvf.command == "WRITE" or rvf.command == "READ" or rvf.command == "WRITE_READ":
         resp.command = rvf.command
     elif rvf.command == "ADDRESS":
         self.response_cv.notify()
     else:
         raise SchedulerError("Invalid command received.")
     self.host_interface.response(resp)
     self.request_count -= 1
     if self.request_count == 0:
         pass  # Notify all requests have been satisfied
     from p2654model.scheduler.Scheduler import SchedulerFactory
     SchedulerFactory.get_scheduler().clear_pending()
예제 #6
0
 def apply(self):
     self.capture = False
     if not self.cached:
         self.__init_segments()
         self.cached = True
     seg = self.depth()
     while seg is not None:
         seg.apply()
         seg = seg.breadth()
     if self.pending:
         # Concatenate vectors together into a single vector to scan
         value = concat([v for v in self.segments])
         wrvf = RVF()
         if self.capture:
             wrvf.command = "CAPSCAN"
         else:
             wrvf.command = "SCAN"
         wrvf.uid = self.uid
         wrvf.payload = value
         self.client_interface.request(wrvf)
         self.request_count += 1
         self.pending = False
         self.logger.debug(
             "IJTAGNetwork.apply(uid={:d}, command={:s}, payload={:s})\n".
             format(wrvf.uid, wrvf.command, str(wrvf.payload)))
예제 #7
0
 def apply(self):
     if self.pending:
         self.local_access_mutex.acquire()
         if self.capture:
             wrvf = RVF()
             wrvf.command = "CAPSCAN"
         else:
             wrvf = RVF()
             wrvf.command = "SCAN"
         wrvf.uid = self.uid
         wrvf.payload = self.__value
         self.client_interface.request(wrvf)
         self.request_count += 1
         self.pending = False
         self.local_access_mutex.release()
         self.logger.debug(
             "ScanRegister.apply(uid={:d}, command={:s}, payload={:s})\n".
             format(wrvf.uid, wrvf.command, str(wrvf.payload)))
예제 #8
0
 def __list_callbacks(self, rvf: RVF):
     if self.host_interface is None:
         raise SchedulerError("host_interface must be defined.")
     cbs = self.host_callbacks.keys()
     msg = ""
     first = True
     for c in cbs:
         if first:
             msg = c
             first = False
         else:
             msg = msg + ", " + c
     rvf.payload = msg
     seg = self.depth()
     while seg is not None:
         if seg.uid == rvf.uid:
             seg.client_interface.response(rvf)
             break
         seg = seg.breadth()
예제 #9
0
 def apply(self):
     if self.keyreg is None:
         raise SchedulerError("keyreg must be defined before use.")
     # self.capture = False
     self.pending_count = 0
     seg = self.depth()
     while seg is not None:
         seg.apply()
         seg = seg.breadth()
     if self.pending_count > 1:
         raise SchedulerError("Multiple competing paths detected.")
     try:
         self.selected_seg = self.description.get_ir_dr(
             self.keyreg.get_value())
     except SchedulerError:
         self.logger.debug(
             "*******************************************************\n")
         self.keyreg.write(self.description.get_default_code())
         self.selected_seg = self.description.get_ir_dr(
             self.description.get_default_code())
     if self.selected_seg is None:
         raise SchedulerError("No path has been selected.")
     if self.pending:
         self.logger.debug("selected_seg.name = {:s}.".format(
             self.selected_seg.name))
         if self.capture:
             wrvf = RVF()
             wrvf.command = "CAPSCAN"
         else:
             wrvf = RVF()
             wrvf.command = "SCAN"
         wrvf.uid = self.uid
         wrvf.payload = self.value
         self.client_interface.request(wrvf)
         self.request_count += 1
         self.pending = False
         self.capture = False
         self.logger.debug(
             "ScanMux.apply(uid={:d}, command={:s}, payload={:s})\n".format(
                 wrvf.uid, wrvf.command, str(wrvf.payload)))
예제 #10
0
 def apply(self):
     if self.pending:
         self.local_access_mutex.acquire()
         wrvf = RVF()
         if self.capture and not self.update:
             wrvf.command = "READ"
         elif self.capture and self.update:
             wrvf.command = "WRITE_READ"
         elif self.update and not self.capture:
             wrvf.command = "WRITE"
         else:
             raise SchedulerError("Invalid command state!")
         wrvf.uid = self.uid
         wrvf.payload = self.__value
         self.client_interface.request(wrvf)
         self.request_count += 1
         self.pending = False
         self.local_access_mutex.release()
         self.logger.debug("DataRegister.apply(uid={:d}, command={:s}, payload={:s})\n".format(wrvf.uid, wrvf.command,
                                                                                       str(wrvf.payload)))
예제 #11
0
 def apply(self):
     self.capture = False
     self.pending_count = 0
     seg = self.depth()
     while seg is not None:
         seg.apply()
         seg = seg.breadth()
     if self.pending_count > 1:
         raise SchedulerError("Multiple competing paths detected.")
     if self.pending:
         wrvf = RVF()
         self.local_access_mutex.acquire()
         wrvf.uid = self.uid
         wrvf.payload = self.value
         if self.capture:
             wrvf.command = self.command
         else:
             wrvf.command = self.command
         self.client_interface.request(wrvf)
         self.request_count += 1
         self.pending = False
         self.local_access_mutex.release()
예제 #12
0
 def resp_handler(self, rvf: RVF):
     self.logger.debug("TAP.resp_handler(uid={:d}, command={:s}, payload={:s})\n".format(rvf.uid, rvf.command,
                                                                                 str(rvf.payload)))
     uid = rvf.uid
     resp = RVF()
     self.response_mutex.acquire()
     resp.payload = rvf.payload
     self.response_mutex.release()
     if rvf.command == "SIR":
         resp.uid = self.depth().uid
         resp.command = "CAPSCAN"
         self.host_interface.response(resp)
     elif rvf.command == "SIRNC":
         resp.uid = self.depth().uid
         resp.command = "SCAN"
         self.host_interface.response(resp)
     elif rvf.command == "SDR":
         resp.uid = self.depth().breadth().uid
         resp.command = "CAPSCAN"
         self.host_interface.response(resp)
     elif rvf.command == "SDRNC":
         resp.uid = self.depth().breadth().uid
         resp.command = "SCAN"
         self.host_interface.response(resp)
     else:
         raise SchedulerError("Invalid command received.")
     self.request_count -= 1
     if self.request_count == 0:
         pass  # Notify all requests have been satisfied
     SchedulerFactory.get_scheduler().clear_pending()
 def apply(self):
     self.capture = False
     self.pending_count = 0
     seg = self.depth()
     while seg is not None:
         seg.apply()
         seg = seg.breadth()
     if self.pending_count > 1:
         raise SchedulerError("Multiple competing paths detected.")
     if self.pending:
         self.local_access_mutex.acquire()
         uid = self.rvf.uid
         command = self.rvf.command
         payload = self.rvf.payload
         self.pending = False
         self.local_access_mutex.release()
         self.logger.debug("self.rvf.command = {:s}.\n".format(command))
         if command == "SIR":
             self.logger.debug("Calling scan_ir().")
             tdo = self.jtag_controller.scan_ir(len(payload),
                                                str(payload))  # payload must be an intbv type
             resp = RVF()
             resp.command = "SIR"
             resp.uid = uid
             self.logger.debug("SIR tdo={:s}".format(tdo))
             resp.payload = intbv(int(tdo, 16), _nrbits=len(payload))
             self.host_interface.response(resp)
         elif command == "SIRNC":
             # fmt = "{:0" + "{:d}".format((len(self.rvf.payload) + 1) // 4) + "X}"
             # print("fmt = {:s}\n".format(fmt))
             # tdi = fmt.format(int(self.rvf.payload))
             # tdi = "{0:0{1}X}".format(int(payload), (len(payload) + 1) // 4)
             tdi = str(payload)
             self.logger.debug("tdi = {:s}\n".format(tdi))
             self.jtag_controller.scan_ir(len(payload), tdi)  # payload must be an intbv type
             resp = RVF()
             resp.command = "SIRNC"
             resp.uid = self.rvf.uid
             resp.payload = intbv(0)
             self.host_interface.response(resp)
         elif command == "SDR":
             tdo = self.jtag_controller.scan_dr(len(payload),
                                                str(payload))  # payload must be an intbv type
             resp = RVF()
             resp.command = "SDR"
             resp.uid = uid
             self.logger.debug("SDR tdo={:s}".format(tdo))
             resp.payload = intbv(int(tdo, 16), _nrbits=len(payload))
             self.host_interface.response(resp)
         elif command == "SDRNC":
             self.jtag_controller.scan_dr(len(payload),
                                          str(payload))  # payload must be an intbv type
             resp = RVF()
             resp.command = "SDRNC"
             resp.uid = uid
             resp.payload = intbv(0)
             self.host_interface.response(resp)
         else:
             raise SchedulerError("Invalid command detected. ({:s})".format(command))