class MainWindow(QtGui.QMainWindow, QtMainWindow.Ui_qtMainWindow): def __init__(self, cli_param, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.setCentralWidget(self.mdiArea) self.statusTxt = QtGui.QLabel("") self.dagFile = QtGui.QLabel("") self.statusBar().addWidget(self.dagFile) self.statusBar().addWidget(self.statusTxt) # connect to the machine if len(cli_param) > 1: ip = cli_param[1] if len(cli_param) > 2: self.myPC = cli_param[2] else: self.myPC = DEF_MYPC else: ip, ok = QtGui.QInputDialog.getText(None, "Connect to SpiNNaker", "Please specify machine IP", QtGui.QLineEdit.Normal, DEF_HOST) if ok is False: ip = '' print "Using machine at", ip self.mc = MachineController(ip) if BOOT_MACHINE is True: if self.mc.boot() is True: print "Machine is now booted..." else: print "Machine is already booted..." # then use machineInfo to build the map self.mInfo = self.mc.get_system_info() wMachine = self.mInfo.width hMachine = self.mInfo.height self.chipList = self.mInfo.keys() print "Found", len(self.chipList), "active chips:" """ self.mc.iptag_set(0,'192.168.240.2',17892,0,0) # prepare iptag for myTub, because boot in rig doesn't provide this if DEF_HOST=='192.168.240.1': self.statusTxt.setText("Using SpiNN-5 board at {}".format(DEF_HOST)) else: self.statusTxt.setText("Using SpiNN-3 board at {}".format(DEF_HOST)) """ #self.vis = visWidget(wMachine, hMachine, self.chipList, self.mdiArea) # for known dead chips on certain boards knownDeadChips = [] if (len(self.chipList) % 48) != 0: # dead chip is detected lst = QtGui.QInputDialog.getText( self, "Dead chip is detected", "Please provide chip coordinate in () separated by space", QtGui.QLineEdit.Normal, "(0,2)") knownDeadChips = getDeadChipList(lst) self.tgvisWidget = visWidget(wMachine, hMachine, self.chipList, knownDeadChips) self.vis = tgViever(self.tgvisWidget) #self.vis.setGeometry(0,0,1024,1024) #self.vis.scale(0.5,0.5) # put in half size self.vis.hide() self.action_Visualiser.setCheckable(True) #self.action_Visualiser.setChecked(False) self.connect(self.action_Quit, QtCore.SIGNAL("triggered()"), QtCore.SLOT("Quit()")) self.connect(self.action_Load_XML, QtCore.SIGNAL("triggered()"), QtCore.SLOT("loadXML()")) self.connect(self.action_Visualiser, QtCore.SIGNAL("triggered()"), QtCore.SLOT("showVisualiser()")) self.connect(self.action_Send_and_Init, QtCore.SIGNAL("triggered()"), QtCore.SLOT("sendAndInit()")) self.connect(self.actionInspect_SpinConf, QtCore.SIGNAL("triggered()"), QtCore.SLOT("testSpin1()")) self.connect(self.actionSet_Tick, QtCore.SIGNAL("triggered()"), QtCore.SLOT("getSimulationTick()")) self.connect(self.actionStart, QtCore.SIGNAL("triggered()"), QtCore.SLOT("startSim()")) self.connect(self.actionStop, QtCore.SIGNAL("triggered()"), QtCore.SLOT("stopSim()")) # 22 March 2017 - 11:48 - Buat experiment ambil data untuk paper self.timer = QtCore.QTimer(self) #self.timer.setInterval(60000) # one minute experiment self.timer.timeout.connect(self.timeout) # Simulation parameters self.simTick = 1000000 # default value that yield 1second resolution self.runningTime = 0 # 0 means runs forever self.dag = None # this is a list of list of dict that contains target dependency data """ self.srcTarget = dict() # this similar to self.dag, but just contains target for SOURCE node # (as a dict of a list), e.g: from dag0020, srcTarget = {0: [4,3,2]} """ self.srcTarget = list( ) # now scrTarget becomes simpler, because we don't send the trigger's payload self.sdp = sdpComm(self.chipList, ip) self.sdp.histUpdate.connect(self.vis.updateHist) self.setGeometry(0, 0, 1024, 1024) @QtCore.pyqtSlot() def timeout(self): """ Ini buat ambil data. Setelah jalan 1 menit, otomatis stop. Kemudian lihat iobuf dari srcsink node! :return: """ self.stopSim() self.timer.stop() def closeEvent(self, e): self.vis.close() e.accept() @QtCore.pyqtSlot() def Quit(self): # TODO: clean up... self.close() @QtCore.pyqtSlot() def showVisualiser(self): if self.action_Visualiser.isChecked() is True: #self.vis = visWidget(self.mdiArea) # cuman buat sejarah kalau dulu aku letakkan di sini! #self.vis.setGeometry(0,0,1024,1024) self.vis.animate() #self.vis.sceneTimer.start(500) self.vis.show() else: self.vis.deanimate() self.vis.hide() #self.vis.sceneTimer.stop() def buildMap(self): """ Let's build map correctly :input: self.dag :output: self.TGmap """ def readTGmap(self, fname, chipList, numNode): """ Read TGmap configuration from the given fname :param fname: .tgmap configuration file :param chipList: a dict() that contains all active chip coordinate in the machine :return: list() if success, otherwise None """ result = None ok = False with open(fname, 'r') as fid: dct = dict() nodeFound = 0 for line in fid: #print "line:", line idFromXY = getChipIDfromXY(line) if idFromXY is not None: dct.update(idFromXY) nodeFound += 1 if len(dct) > 0: print "Found", nodeFound, "nodes (including SRC/SINK)" result = [-1 for _ in range(len(chipList))] for i in range(len(chipList)): try: result[i] = dct[chipList[i]] except KeyError: result[i] = -1 if nodeFound == numNode + 1: ok = True return result, ok @QtCore.pyqtSlot() def loadXML(self): print "Loading XML..." fullPathFileName = QtGui.QFileDialog.getOpenFileName( self, "Open XML file", "./", "*.xml") if not fullPathFileName: print "Cancelled!" else: fi = QtCore.QFileInfo() fi.setFile(fullPathFileName) fn = fi.fileName() self.dagFile.setText("Using {}".format(fn)) print "Processing ", fullPathFileName parser = xml.sax.make_parser() # turn off namespace parser.setFeature(xml.sax.handler.feature_namespaces, 0) # override the default ContextHandler Handler = tgxmlHandler() parser.setContentHandler(Handler) parser.parse(str(fullPathFileName)) if SHOW_PARSING_RESULT: showParsingResult(Handler) """ Let's put the c-like struct as a list: Let's create a variable cfg, which is a list of a dict. Then, let's create a variable dag, which is a list of cfg. Hence, dag is a list of a list of a dict. """ dag = list() for nodes in Handler.Nodes: cfg = list() srcPayload = list() srcFound = False for target in nodes.Target: dct = dict() dct['nodeID'] = nodes.Id dct['destID'] = target.destId dct['nPkt'] = target.nPkt dct['nDependant'] = target.nDependant for d in range(target.nDependant): srcIDkey = "dep{}_srcID".format(d) nTriggerPktkey = "dep{}_nTriggerPkt".format(d) dct[srcIDkey] = target.Dep[d].srcId dct[nTriggerPktkey] = target.Dep[d].nTriggerPkt # also search for SOURCE dependant if target.Dep[d].srcId == DEF_SOURCE_ID: srcFound = True srcPayload.append(target.Dep[d].nTriggerPkt) cfg.append(dct) # and put the payload to the current word in the dict if srcFound: self.srcTarget.append(nodes.Id) # self.srcTarget[nodes.Id] = srcPayload --> ini yang lama sebelum aku REVISI dag.append(cfg) self.dag = dag #self.dag = experiment_dag0020() # for debugging: #print "SpiNNaker usage :", self.TGmap if SHOW_PARSING_RESULT: print "TG configuration :", self.dag #print len(self.dag) print "Source Target :", self.srcTarget # then load the TGmap configuration file tgmapConfigFile = QtGui.QFileDialog.getOpenFileName( self, "Open TGmap file", "./", "*.tgmap") if not tgmapConfigFile: print "Cancelled!" self.dag = None self.srcTarget = list() return tgmap, ok = self.readTGmap(tgmapConfigFile, self.chipList, len(self.dag)) if tgmap is None: print "Failed to get correct TGmap configuration!" # then cancel the operation and reset self.dag = None self.srcTarget = list() return else: if ok: #print tgmap print "Loaded tgmap from:", tgmapConfigFile self.TGmap = tgmap else: print "Missing node is detected! Maybe dead chip?" # then cancel the operation and reset self.dag = None self.srcTarget = list() """ # Then ask for the appropriate map cbItem = tg2spinMap.keys(); # simTick, ok = QtGui.QInputDialog.getInt(self, "Simulation Tick", "Enter Simulation Tick in microsecond", self.simTick, DEF_MIN_TIMER_TICK, 10000000, 1) mapItem, ok = QtGui.QInputDialog.getItem(self, "Select Map", "Which map will be used?", cbItem, 0, False) if ok is True: print "Will use",mapItem,':',tg2spinMap[str(mapItem)] # self.initMap(mapItem) self.TGmap = tg2spinMap[str(mapItem)] else: print "Cancelled!" return """ # continue with send and init? contSendInit = QtGui.QMessageBox.question( self, "Continue", "Continue with Send and Init?", QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) if contSendInit == QtGui.QMessageBox.Ok: self.sendAndInit() else: QtGui.QMessageBox.information( self, "Done", "Loading XML and TGmap is done! You can continue with Send and Init!" ) @QtCore.pyqtSlot() def testSpin1(self): """ send a request to dump tgsdp configuration data sendSDP(self, flags, tag, dp, dc, dax, day, cmd, seq, arg1, arg2, arg3, bArray): """ f = NO_REPLY t = DEF_SEND_IPTAG p = DEF_SDP_CONF_PORT c = DEF_SDP_CORE m = TGPKT_HOST_ASK_REPORT for item in self.TGmap: if item != -1 and item != DEF_SOURCE_ID: x, y = getChipXYfromID(self.TGmap, item, self.chipList) #print "Sending a request to <{},{}:{}>".format(x,y,c) self.sdp.sendSDP(f, t, p, c, x, y, m, 0, 0, 0, 0, None) time.sleep(DEF_SDP_TIMEOUT) @QtCore.pyqtSlot() def sendAndInit(self): """ will send aplx to corresponding chip and initialize/configure the chip Assuming that the board has been booted? """ if self.dag == None: QtGui.QMessageBox.information(self, "Information", "No valid network structure yet!") return # First, need to translate from node-ID to chip position <x,y>, including the SOURCE and SINK node # use self.TGmap print "Doing translation from node to chip..." self.xSrc, self.ySrc = getChipXYfromID(self.TGmap, DEF_SOURCE_ID, self.chipList) appCores = dict() for item in self.TGmap: if item != -1 and item != DEF_SOURCE_ID: x, y = getChipXYfromID(self.TGmap, item, self.chipList) appCores[(x, y)] = [DEF_APP_CORE] if SHOW_PARSING_RESULT: print "Application cores :", appCores allChips = dict() for item in self.chipList: allChips[(item[0], item[1])] = [DEF_MON_CORE] if SHOW_PARSING_RESULT: print "Monitor cores :", allChips # Second, send the aplx (tgsdp.aplx and srcsink.aplx) to the corresponding chip # example: mc.load_application("bla_bla_bla.aplx", {(0,0):[1,2,10,17]}, app_id=16) # so, the chip is a tupple and cores is in a list!!! # Do you want something nice? Use QFileDialog if ENABLE_IPTAG: print "Send iptag..." self.mc.iptag_set( DEF_TUBO_IPTAG, self.myPC, DEF_TUBO_PORT, 0, 0 ) # prepare iptag for myTub, because boot in rig doesn't provide this self.mc.iptag_set(DEF_REPORT_IPTAG, self.myPC, DEF_REPORT_PORT, 0, 0) print "Send the aplxs to the corresponding chips...", srcsinkaplx = "/local/new_home/indi/Projects/P/Graceful_TG_SDP_virtualenv/src/aplx/srcsink.aplx" tgsdpaplx = "/local/new_home/indi/Projects/P/Graceful_TG_SDP_virtualenv/src/aplx/tgsdp.aplx" monaplx = "/local/new_home/indi/Projects/P/Graceful_TG_SDP_virtualenv/src/aplx/monitor.aplx" self.mc.load_application(srcsinkaplx, {(self.xSrc, self.ySrc): [DEF_APP_CORE]}, app_id=APPID_SRCSINK) self.mc.load_application(tgsdpaplx, appCores, app_id=APPID_TGSDP) self.mc.load_application(monaplx, allChips, app_id=APPID_MONITOR) time.sleep(5) self.mc.send_signal('sync0', app_id=APPID_SRCSINK) self.mc.send_signal('sync0', app_id=APPID_TGSDP) self.mc.send_signal('sync0', app_id=APPID_MONITOR) print "done!" # Debugging: why some chips generate WDOG? self.sdp.sendPing(self.TGmap) # Third, send the configuration to the corresponding node print "Sending the configuration data to the corresponding chip...", for node in self.dag: # self.dag should be a list of a list of a dict #print "Node =",node time.sleep( DEF_SDP_TIMEOUT ) # WEIRD!!!! If I remove this, then node-0 will be corrupted!!! self.sdp.sendConfig(self.TGmap, node) print "done!" print "Sending special configuration to SOURCE/SINK node...", # TODO: send the source target list!!! self.sdp.sendSourceTarget( self.TGmap, self.srcTarget) # butuh TGmap karena butuh xSrc dan ySrc print "done! ---------- WAIT, Abaikan nilai payload-nya!!!! ------------" # NOTE: di bagian sdp.sendSourceTarget() tidak aku ubah untuk akomodasi hal tersebut!!!!!!!!! # Jadi, sangat tergantung srcsink.c untuk betulin-nya!!!! print "Sending network map...", self.sdp.sendChipMap(self.TGmap) print "done! SpiNNaker is ready for TGSDP simulation (set tick if necessary)!" QtGui.QMessageBox.information( self, "Done", "SpiNNaker is ready for TGSDP simulation (set tick if necessary)!") # TODO: 1. Baca P2P table # 2. Petakan dan kirim ke tgsdpvis.py. Nanti tgsdpvis.py akan memberi warna apasihini = self.mc.get_system_info() p2p_tables = {(x, y): self.mc.get_p2p_routing_table(x, y) for x, y in self.mc.get_system_info()} #for c in apasihini.chips(): # print c @QtCore.pyqtSlot() def getSimulationTick(self): simTick, ok = QtGui.QInputDialog.getInt( self, "Simulation Tick", "Enter Simulation Tick in microsecond", self.simTick, DEF_MIN_TIMER_TICK, 1000, 1) if ok is True: print "Sending tick {} microseconds".format(simTick) self.simTick = simTick self.sdp.sendSimTick(self.xSrc, self.ySrc, simTick) @QtCore.pyqtSlot() def startSim(self): # First ask, for how long msLong, ok = QtGui.QInputDialog.getInt( self, "Running Time", "Enter simulation running time (in ms)", 60000, DEF_MIN_RUNNING_TIME, DEF_MAX_RUNNING_TIME, 1) if ok: self.runningTime = msLong self.actionStop.setEnabled(True) self.actionStart.setEnabled(False) self.sdp.sendStartCmd(self.xSrc, self.ySrc) print "Starting simulation..." # untuk ambil data, buat timer: if self.runningTime > 0: print "Set interval to", self.runningTime, "ms" self.timer.setInterval(self.runningTime) self.timer.start() @QtCore.pyqtSlot() def stopSim(self): if self.timer.isActive(): self.timer.stop() self.actionStop.setEnabled(False) self.actionStart.setEnabled(True) # self.sdp.sendStopCmd(self.xSrc, self.ySrc) #-> only to SOURCE/SINK node self.sdp.sendStopCmd(self.xSrc, self.ySrc, self.TGmap) #-> to all nodes print "Experimen selesai. Sekarang lihat iobuf core-1 di chip<0,0> (srcsink node)" QtGui.QMessageBox.information( self, "Experiment Done!", "Look the result at iobuf core-1 in chip<0,0> (srcsink node)!")
class MainWindow(QtGui.QMainWindow, QtMainWindow.Ui_qtMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.setCentralWidget(self.mdiArea) self.statusTxt = QtGui.QLabel("") self.dagFile = QtGui.QLabel("") self.statusBar().addWidget(self.dagFile) self.statusBar().addWidget(self.statusTxt) self.vis = visWidget(self.mdiArea) self.vis.setGeometry(0, 0, 1024, 1024) #self.vis.scale(0.5,0.5) # put in half size self.vis.hide() self.action_Visualiser.setCheckable(True) #self.action_Visualiser.setChecked(False) self.connect(self.action_Quit, QtCore.SIGNAL("triggered()"), QtCore.SLOT("Quit()")) self.connect(self.action_Load_XML, QtCore.SIGNAL("triggered()"), QtCore.SLOT("loadXML()")) self.connect(self.action_Visualiser, QtCore.SIGNAL("triggered()"), QtCore.SLOT("showVisualiser()")) self.connect(self.action_Send_and_Init, QtCore.SIGNAL("triggered()"), QtCore.SLOT("sendAndInit()")) self.connect(self.actionInspect_SpinConf, QtCore.SIGNAL("triggered()"), QtCore.SLOT("testSpin1()")) self.connect(self.actionSet_Tick, QtCore.SIGNAL("triggered()"), QtCore.SLOT("getSimulationTick()")) self.connect(self.actionStart, QtCore.SIGNAL("triggered()"), QtCore.SLOT("startSim()")) self.connect(self.actionStop, QtCore.SIGNAL("triggered()"), QtCore.SLOT("stopSim()")) self.simTick = 1000000 # default value that yield 1second resolution self.output = None # this is a list of list of dict that contains target dependency data """ self.srcTarget = dict() # this similar to self.output, but just contains target for SOURCE node # (as a dict of a list), e.g: from dag0020, srcTarget = {0: [4,3,2]} """ self.srcTarget = list( ) # now scrTarget becomes simpler, because we don't send the trigger's payload self.sdp = sdpComm() self.sdp.histUpdate.connect(self.vis.updateHist) self.mc = MachineController(DEF_HOST) if BOOT_MACHINE is True: if self.mc.boot() is True: print "Machine is now booted..." else: print "Machine is already booted..." self.machineInfo = self.mc.get_system_info() """ self.mc.iptag_set(0,'192.168.240.2',17892,0,0) # prepare iptag for myTub, because boot in rig doesn't provide this if DEF_HOST=='192.168.240.1': self.statusTxt.setText("Using SpiNN-5 board at {}".format(DEF_HOST)) else: self.statusTxt.setText("Using SpiNN-3 board at {}".format(DEF_HOST)) """ self.setGeometry(0, 0, 1024, 1024) @QtCore.pyqtSlot() def Quit(self): # TODO: clean up... self.close() @QtCore.pyqtSlot() def showVisualiser(self): if self.action_Visualiser.isChecked() is True: #self.vis = visWidget(self.mdiArea) # cuman buat sejarah kalau dulu aku letakkan di sini! #self.vis.setGeometry(0,0,1024,1024) self.vis.sceneTimer.start(500) self.vis.show() else: self.vis.hide() self.vis.sceneTimer.stop() @QtCore.pyqtSlot() def loadXML(self): print "Loading XML..." fullPathFileName = QtGui.QFileDialog.getOpenFileName( self, "Open XML file", "./", "*.xml") if not fullPathFileName: print "Cancelled!" else: # Then ask for the appropriate map cbItem = tg2spinMap.keys() # simTick, ok = QtGui.QInputDialog.getInt(self, "Simulation Tick", "Enter Simulation Tick in microsecond", self.simTick, DEF_MIN_TIMER_TICK, 10000000, 1) mapItem, ok = QtGui.QInputDialog.getItem( self, "Select Map", "Which map will be used?", cbItem, 0, False) if ok is True: print "Will use", mapItem # self.initMap(mapItem) self.TGmap = tg2spinMap[str(mapItem)] else: print "Cancelled!" return fi = QtCore.QFileInfo() fi.setFile(fullPathFileName) fn = fi.fileName() self.dagFile.setText("Using {}".format(fn)) print "Processing ", fullPathFileName parser = xml.sax.make_parser() # turn off namespace parser.setFeature(xml.sax.handler.feature_namespaces, 0) # override the default ContextHandler Handler = tgxmlHandler() parser.setContentHandler(Handler) parser.parse(str(fullPathFileName)) if SHOW_PARSING_RESULT: showParsingResult(Handler) """ Let's put the c-like struct as a list: Let's create a variable cfg, which is a list of a dict. Then, let's create a variable dag, which is a list of cfg. Hence, dag is a list of a list of a dict. """ dag = list() for nodes in Handler.Nodes: cfg = list() srcPayload = list() srcFound = False for target in nodes.Target: dct = dict() dct['nodeID'] = nodes.Id dct['destID'] = target.destId dct['nPkt'] = target.nPkt dct['nDependant'] = target.nDependant for d in range(target.nDependant): srcIDkey = "dep{}_srcID".format(d) nTriggerPktkey = "dep{}_nTriggerPkt".format(d) dct[srcIDkey] = target.Dep[d].srcId dct[nTriggerPktkey] = target.Dep[d].nTriggerPkt # also search for SOURCE dependant if target.Dep[d].srcId == DEF_SOURCE_ID: srcFound = True srcPayload.append(target.Dep[d].nTriggerPkt) cfg.append(dct) # and put the payload to the current word in the dict if srcFound: self.srcTarget.append(nodes.Id) # self.srcTarget[nodes.Id] = srcPayload --> ini yang lama sebelum aku REVISI dag.append(cfg) self.output = dag #self.output = experiment_dag0020() # for debugging: print "SpiNNaker usage :", self.TGmap print "TG configuration :", self.output print "Source Target :", self.srcTarget @QtCore.pyqtSlot() def testSpin1(self): """ send a request to dump tgsdp configuration data sendSDP(self, flags, tag, dp, dc, dax, day, cmd, seq, arg1, arg2, arg3, bArray): """ f = NO_REPLY t = DEF_SEND_IPTAG p = DEF_SDP_CONF_PORT c = DEF_SDP_CORE m = TGPKT_HOST_ASK_REPORT for item in self.TGmap: if item != -1 and item != DEF_SOURCE_ID: x, y = getChipXYfromID(self.TGmap, item) #print "Sending a request to <{},{}:{}>".format(x,y,c) self.sdp.sendSDP(f, t, p, c, x, y, m, 0, 0, 0, 0, None) time.sleep(DEF_SDP_TIMEOUT) @QtCore.pyqtSlot() def sendAndInit(self): """ will send aplx to corresponding chip and initialize/configure the chip Assuming that the board has been booted? """ if self.output == None: QtGui.QMessageBox.information(self, "Information", "No valid network structure yet!") return # First, need to translate from node-ID to chip position <x,y>, including the SOURCE and SINK node # use self.TGmap print "Do translation from node to chip..." self.xSrc, self.ySrc = getChipXYfromID(self.TGmap, DEF_SOURCE_ID) appCores = dict() for item in self.TGmap: if item != -1 and item != DEF_SOURCE_ID: x, y = getChipXYfromID(self.TGmap, item) appCores[(x, y)] = [DEF_APP_CORE] print "Application cores :", appCores allChips = dict() for item in CHIP_LIST_48: allChips[(item[0], item[1])] = [DEF_MON_CORE] print "Monitor cores :", allChips # Second, send the aplx (tgsdp.aplx and srcsink.aplx) to the corresponding chip # example: mc.load_application("bla_bla_bla.aplx", {(0,0):[1,2,10,17]}, app_id=16) # so, the chip is a tupple and cores is in a list!!! # Do you want something nice? Use QFileDialog print "Send iptag...", self.mc.iptag_set( DEF_TUBO_IPTAG, '192.168.240.2', DEF_TUBO_PORT, 0, 0 ) # prepare iptag for myTub, because boot in rig doesn't provide this self.mc.iptag_set(DEF_REPORT_IPTAG, '192.168.240.2', DEF_REPORT_PORT, 0, 0) if DEF_HOST == '192.168.240.1': self.statusTxt.setText( "Using SpiNN-5 board at {}".format(DEF_HOST)) else: self.statusTxt.setText( "Using SpiNN-3 board at {}".format(DEF_HOST)) print "done!" print "Send the aplxs to the corresponding chips...", srcsinkaplx = "/local/new_home/indi/Projects/P/Graceful_TG_SDP_virtualenv/src/aplx/srcsink.aplx" tgsdpaplx = "/local/new_home/indi/Projects/P/Graceful_TG_SDP_virtualenv/src/aplx/tgsdp.aplx" monaplx = "/local/new_home/indi/Projects/P/Graceful_TG_SDP_virtualenv/src/aplx/monitor.aplx" self.mc.load_application(srcsinkaplx, {(self.xSrc, self.ySrc): [DEF_APP_CORE]}, app_id=APPID_SRCSINK) self.mc.load_application(tgsdpaplx, appCores, app_id=APPID_TGSDP) self.mc.load_application(monaplx, allChips, app_id=APPID_MONITOR) print "done!" # Debugging: why some chips generate WDOG? self.sdp.sendPing(self.TGmap) # Third, send the configuration to the corresponding node print "Sending the configuration data to the corresponding chip...", for node in self.output: # self.output should be a list of a list of a dict #print "Node =",node time.sleep( DEF_SDP_TIMEOUT ) # WEIRD!!!! If I remove this, then node-0 will be corrupted!!! self.sdp.sendConfig(self.TGmap, node) print "done!" print "Sending special configuration to SOURCE/SINK node...", # TODO: send the source target list!!! self.sdp.sendSourceTarget( self.TGmap, self.srcTarget) # butuh TGmap karena butuh xSrc dan ySrc print "done! ---------- WAIT, Abaikan nilai payload-nya!!!! ------------" # NOTE: di bagian sdp.sendSourceTarget() tidak aku ubah untuk akomodasi hal tersebut!!!!!!!!! # Jadi, sangat tergantung srcsink.c untuk betulin-nya!!!! print "Sending network map...", self.sdp.sendChipMap(self.TGmap) print "done! SpiNNaker is ready for TGSDP simulation (set tick if necessary)!" # TODO: 1. Baca P2P table # 2. Petakan dan kirim ke tgsdpvis.py. Nanti tgsdpvis.py akan memberi warna apasihini = self.mc.get_system_info() p2p_tables = {(x, y): self.mc.get_p2p_routing_table(x, y) for x, y in self.mc.get_system_info()} #for c in apasihini.chips(): # print c @QtCore.pyqtSlot() def getSimulationTick(self): simTick, ok = QtGui.QInputDialog.getInt( self, "Simulation Tick", "Enter Simulation Tick in microsecond", self.simTick, DEF_MIN_TIMER_TICK, 10000000, 1) if ok is True: print "Sending tick {} microseconds".format(simTick) self.simTick = simTick self.sdp.sendSimTick(self.xSrc, self.ySrc, simTick) @QtCore.pyqtSlot() def startSim(self): self.actionStop.setEnabled(True) self.actionStart.setEnabled(False) self.sdp.sendStartCmd(self.xSrc, self.ySrc) @QtCore.pyqtSlot() def stopSim(self): self.actionStop.setEnabled(False) self.actionStart.setEnabled(True) # self.sdp.sendStopCmd(self.xSrc, self.ySrc) #-> only to SOURCE/SINK node self.sdp.sendStopCmd(self.xSrc, self.ySrc, self.TGmap) #-> to all nodes
class MainWindow(QtGui.QMainWindow, QtMainWindow.Ui_QtMainWindow): """ It inherits QMainWindow and uses pyuic4-generated python files from the .ui """ pltDataRdy = pyqtSignal(list) # for streaming data to the plotter/calibrator def __init__(self, mIP=None, logFName=None, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.setCentralWidget(self.mdiArea); self.statusTxt = QtGui.QLabel("") self.statusBar().addWidget(self.statusTxt) # load setting self.loadSettings() # if machine IP is provided, check if it is booted and/or if the profiler has been loaded if mIP is not None: self.mIP = mIP self.checkSpiNN4() else: self.mIP = None self.connect(self.actionShow_Chips, SIGNAL("triggered()"), SLOT("showChips()")) """ Scenario: - sw and pw send data to MainWindow - MainWindow do the averaging on sw data, then send avg_sw and pw to plotter At the same time, MainWindow store the data """ #-------------------- GUI setup --------------------- # Dump raw data in arduConsole widget (cw). self.cw = ifaceArduSpiNN(logFName,self) self.subWinConsole = QtGui.QMdiSubWindow(self) self.subWinConsole.setWidget(self.cw) self.mdiArea.addSubWindow(self.subWinConsole) self.subWinConsole.setGeometry(0,0,self.cw.width(),500) self.cw.show() # Power plot widget (pw). self.pw = Pwidget(self) self.subWinPW = QtGui.QMdiSubWindow(self) self.subWinPW.setWidget(self.pw) self.mdiArea.addSubWindow(self.subWinPW) self.subWinPW.setGeometry(self.cw.width()+10,0,760,500) self.pw.show() # SpiNNaker profiler plot widget (sw). self.sw = Swidget(self) self.subWinSW = QtGui.QMdiSubWindow(self) self.subWinSW.setWidget(self.sw) self.mdiArea.addSubWindow(self.subWinSW) self.subWinSW.setGeometry(self.subWinPW.x(), self.subWinPW.y()+self.subWinPW.height(),760,500) self.sw.show() # initially, we don't show chip visualizer self.vis = None # SIGNAL-SLOT connection self.cw.spinUpdate.connect(self.sw.readPltData) self.cw.arduUpdate.connect(self.pw.readPltData) # just for debugging: # self.cw.arduUpdate.connect(self.readArduData) # self.cw.spinUpdate.connect(self.readSpinData) def loadSettings(self): """ Load configuration setting from file. Let's use INI format and UserScope :return: """ #init value self.conf = config() #if used before, then load from previous one; otherwise, it use the initial value above self.settings = QSettings(QSettings.IniFormat, QSettings.UserScope, "APT", "SpiNN-4 Power Profiler") self.conf.xPos,ok = self.settings.value(self.conf.xPosKey, self.conf.xPos).toInt() self.conf.yPos,ok = self.settings.value(self.conf.yPosKey, self.conf.yPos).toInt() self.conf.width,ok = self.settings.value(self.conf.widthKey, self.conf.width).toInt() self.conf.height,ok = self.settings.value(self.conf.heightKey, self.conf.height).toInt() #print "isWritable?", self.settings.isWritable() #print "conf filename", self.settings.fileName() #then apply to self self.setGeometry(self.conf.xPos, self.conf.yPos, self.conf.width, self.conf.height) def checkSpiNN4(self, alwaysAsk=True): #return #go out immediately for experiment with Basab """ if the MainWindow class is called with an IP, then check if the machine is ready """ loadProfiler = False # first, check if the machine is booted print "Check the machine: ", self.mc = MachineController(self.mIP) bootByMe = self.mc.boot() # if bootByMe is true, then the machine is booted by readSpin4Pwr.py, otherwise it is aleady booted # if rig cannot boot the machine (eq. the machine is not connected or down), the you'll see error # message in the arduConsole if bootByMe is False: print "it is booted already!" else: print "it is now booted!" loadProfiler = True alwaysAsk = False # because the machine is just booted, then force it load profiler # second, ask if profilers need to be loaded cpustat = self.mc.get_processor_status(1,0,0) #core-1 in chip <0,0> profName = cpustat.app_name profState = int(cpustat.cpu_state) profVersion = cpustat.user_vars[0] # read from sark.vcpu->user0 #print "Profiler name: ", profName #print "Profiler state: ", profState #print "Profiler version: ", profVersion if profName.upper()==DEF.REQ_PROF_NAME.upper() and profState==7 and profVersion==DEF.REQ_PROF_VER: print "Required profiler.aplx is running!" loadProfiler = False else: if alwaysAsk: askQ = raw_input('Load the correct profiler.aplx? [Y/n]') if len(askQ) == 0 or askQ.upper() == 'Y': loadProfiler = True else: loadProfiler = False print "[WARNING] profiler.aplx is not ready or invalid version" # third, load the profilers if loadProfiler: # then load the correct profiler version print "Loading profiler from", DEF.REQ_PROF_APLX # populate all chips in the board chips = self.mc.get_system_info().keys() dest = dict() for c in chips: dest[c] = [1] # the profiler.aplx goes to core-1 self.mc.load_application(DEF.REQ_PROF_APLX, dest, app_id=DEF.REQ_PROF_APLX_ID) print "Profilers are sent to SpiNN4!" else: print "No valid profiler! This program might not work correctly!" # Last but important: MAKE SURE IPTAG 3 IS SET iptag = self.mc.iptag_get(DEF.REPORT_IPTAG,0,0) if iptag.addr is '0.0.0.0' or iptag.port is not DEF.REPORT_IPTAG: #iptag DEF.REPORT_IPTAG is not defined yet self.mc.iptag_set(DEF.REPORT_IPTAG, DEF.HOST_PC, DEF.RECV_PORT, 0, 0) @pyqtSlot() def reactiveShopCipMenu(self): self.actionShow_Chips.setEnabled(True) del self.subWinVis @pyqtSlot() def showChips(self): """ Show chip layout :return: """ if self.mIP is None: """ i.e., the IP is not defined when this menu is clicked """ # first, ask the IP of the machine mIP, ok = QtGui.QInputDialog.getText(self, "SpiNN4 Location", "SpiNN4 IP address", QtGui.QLineEdit.Normal, DEF.MACHINE) if ok is True: self.mIP = mIP self.checkSpiNN4(False) # after this, self.mc is available # then open the widget mInfo = self.mc.get_system_info() w = mInfo.width h = mInfo.height chipList = mInfo.keys() #self.vis = visWidget(w, h, chipList) # Segmentation fault self.vis = visWidget(w, h, chipList, self) self.subWinVis = QtGui.QMdiSubWindow(self) self.subWinVis.setWidget(self.vis) self.mdiArea.addSubWindow(self.subWinVis) #self.subWinVis.setGeometry(self.subWinPW.x(), self.subWinPW.y()+self.subWinPW.height(),760,500) # connect to the source of temperature data # masih salah: self.cw.spinUpdate.connect(self.vis.readSpinData) self.vis.show() # and disable the menu item self.actionShow_Chips.setEnabled(False) # the menu will be reset to enable if the widget is closed self.vis.visWidgetTerminated.connect(self.reactiveShopCipMenu) """ ######################### GUI callback ########################### """ # readSpinData and readArduData are just for debugging @pyqtSlot(list) def readSpinData(self, prfData): """ Read profiler data and prepare for saving. prfData is a list of 48 "Integer" item that should be decoded as: freq, nActive, temp Hence, fmt = "<2BH" """ #print len(prfData) #print type(prfData[0]) #return fmt = "<2BH" #fmt = "<H2B" print "{", for i in range(len(prfData)): cpu = struct.pack("<I",prfData[i]) #print "0x%x " % cpu, #f,nA,T = struct.unpack(fmt, prfData[i]) f,nA,T = struct.unpack(fmt, cpu) #print "[{},{},{}]".format(f,nA,T), if i < (len(prfData)-1): print "[{},{},{}],".format(f, nA, T), else: print "[{},{},{}]".format(f, nA, T), print "}" @pyqtSlot(list) def readArduData(self, pwrData): """ Read power data from Arduino and prepare for saving. """ def closeEvent(self, event): #print "x, y, w, h =",self.x(),self.y(),self.width(),self.height() # save the current configuration self.settings = QSettings(QSettings.IniFormat, QSettings.UserScope, "APT", "SpiNN-4 Power Profiler") self.settings.setValue(self.conf.xPosKey, self.x()) self.settings.setValue(self.conf.yPosKey, self.y()) self.settings.setValue(self.conf.widthKey, self.width()) self.settings.setValue(self.conf.heightKey, self.height()) self.settings.sync() #print "Conf saved!" # Notify ifaceArduSpiNN to stop the thread: self.cw.stop() # to avoid QThread being destroyed while thread is still running event.accept()