From 9dca5a89f82d1737c5588e92d82e24be27d3644b Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Wed, 6 Mar 2024 14:53:34 +0800 Subject: [PATCH 01/15] Two errors have been figured out. --- run_docker.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_docker.sh b/run_docker.sh index fc721c4..cdd784d 100644 --- a/run_docker.sh +++ b/run_docker.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash IMAGE=cgra/cgra-flow:demo -COMMAND=/bin/bash +#COMMAND=/bin/bash NIC=$(sudo cat /proc/net/dev | awk 'END {print $1}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g') # Grab the ip address of this box @@ -11,7 +11,7 @@ DISP_NUM=100 # fixed display number to 100 PORT_NUM=$((6000 + DISP_NUM)) -socat TCP-LISTEN:${PORT_NUM},reuseaddr,fork UNIX-CLIENT:/tmp/.X11-unix/X0 2>&1 > /dev/null & +socat TCP-LISTEN:${PORT_NUM},reuseaddr,fork UNIX-CLIENT:/tmp/.X11-unix/X0 > /dev/null 2>&1 & XSOCK=/tmp/.X11-unix From 18e81f7a402aea86bebcaf191b2e411b373e7a49 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Wed, 6 Mar 2024 15:04:19 +0800 Subject: [PATCH 02/15] Two errors finished From 9252d52205fc35e1839696c20235f6ffed1108eb Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Wed, 6 Mar 2024 15:19:38 +0800 Subject: [PATCH 03/15] About another two errors --- run_docker.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_docker.sh b/run_docker.sh index cdd784d..c18caf4 100644 --- a/run_docker.sh +++ b/run_docker.sh @@ -5,7 +5,7 @@ IMAGE=cgra/cgra-flow:demo NIC=$(sudo cat /proc/net/dev | awk 'END {print $1}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g') # Grab the ip address of this box -IPADDR=$(ifconfig $NIC | grep "inet " | awk '{print $2}') +IPADDR=$(ifconfig "$NIC" | grep "inet " | awk '{print $2}') DISP_NUM=100 # fixed display number to 100 @@ -19,6 +19,6 @@ sudo docker run \ -it \ --name=CGRA-Flow \ -v $XSOCK:$XSOCK:rw \ - -e DISPLAY=$IPADDR:$DISP_NUM \ + -e DISPLAY="$IPADDR":$DISP_NUM \ $IMAGE From 62668401988dfe618e94170740c91db337db1a7f Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Mon, 11 Mar 2024 09:44:11 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E6=94=B9=E5=A5=BD=E5=90=8E=E7=9A=84run?= =?UTF-8?q?=5Fdocker.sh=E6=96=87=E4=BB=B6=EF=BC=8C=E6=B3=A8=E6=84=8FDISPLA?= =?UTF-8?q?Y=E7=9A=84=E7=AB=AF=E5=8F=A3=EF=BC=8C=E4=BB=A5=E5=8F=8Asudo=20d?= =?UTF-8?q?ocker=20run=E5=90=8E=E7=BB=AD=E7=9A=84=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run_docker.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) mode change 100644 => 100755 run_docker.sh diff --git a/run_docker.sh b/run_docker.sh old mode 100644 new mode 100755 index c18caf4..7b52d54 --- a/run_docker.sh +++ b/run_docker.sh @@ -7,7 +7,7 @@ NIC=$(sudo cat /proc/net/dev | awk 'END {print $1}' | sed 's/^[\t]*//g' | sed 's # Grab the ip address of this box IPADDR=$(ifconfig "$NIC" | grep "inet " | awk '{print $2}') -DISP_NUM=100 # fixed display number to 100 +DISP_NUM=12 # fixed display number to 100 PORT_NUM=$((6000 + DISP_NUM)) @@ -17,8 +17,11 @@ XSOCK=/tmp/.X11-unix sudo docker run \ -it \ - --name=CGRA-Flow \ + --name=CGRA-Flow-v2 \ -v $XSOCK:$XSOCK:rw \ + -v /etc/localtime:/etc/localtime:ro \ -e DISPLAY="$IPADDR":$DISP_NUM \ + -e GDK_SCALE \ + -e GDIK_DPI_SCALE \ $IMAGE From 0351b22efd81876bfa589b8ad76840ba190b1f69 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Mon, 11 Mar 2024 09:44:11 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E6=94=B9=E5=A5=BD=E5=90=8E=E7=9A=84run?= =?UTF-8?q?=5Fdocker.sh=E6=96=87=E4=BB=B6=EF=BC=8C=E6=B3=A8=E6=84=8FDISPLA?= =?UTF-8?q?Y=E7=9A=84=E7=AB=AF=E5=8F=A3=EF=BC=8C=E4=BB=A5=E5=8F=8Asudo=20d?= =?UTF-8?q?ocker=20run=E5=90=8E=E7=BB=AD=E7=9A=84=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel.cpp | 38 ---------- launchUI.py | 194 ++++++++++++++++++++++++++------------------------ run_docker.sh | 7 +- script1.py | 11 +++ 4 files changed, 118 insertions(+), 132 deletions(-) delete mode 100644 kernel.cpp mode change 100644 => 100755 run_docker.sh create mode 100755 script1.py diff --git a/kernel.cpp b/kernel.cpp deleted file mode 100644 index 21b812b..0000000 --- a/kernel.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#define NTAPS 32 - -float input[NTAPS]; -float output[NTAPS]; -float coefficients[NTAPS] = {0.25, 1.50, 3.75, -2.25, 0.50, 0.75, -3.00, 1.25, -0.25, 1.50, 3.75, -2.25, 0.50, 0.75, -3.00, 1.25, -0.25, 1.50, 3.75, -2.25, 0.50, 0.75, -3.00, 1.25, -0.25, 1.50, 3.75, -2.25, 0.50, 0.75, -3.00, 1.25}; - -void kernel(float input[], float output[], float coefficient[]); - -int main() -{ - -// input_dsp (input, NTAPS, 0); - - kernel(input, output, coefficients); - -// output_dsp (input, NTAPS, 0); -// output_dsp (coefficients, NTAPS, 0); -// output_dsp (output, NTAPS, 0); - return 0; -} - -void kernel(float input[], float output[], float coefficient[]) -/* input : input sample array */ -/* output: output sample array */ -/* coefficient: coefficient array */ -{ - int i; - int j = 0; - -// for(j=0; j< NTAPS; ++j) { - for (i = 0; i < NTAPS; ++i) { - output[j] += input[i] * coefficient[i]; - } -// } -} diff --git a/launchUI.py b/launchUI.py index da51232..c8444de 100644 --- a/launchUI.py +++ b/launchUI.py @@ -11,6 +11,7 @@ from tkinter import filedialog as fd from PIL import Image, ImageTk, ImageFile from functools import partial +from Downloads.OpenCGRA.cgra.translate.CGRARTL_test import test_cgra_universal from VectorCGRA.cgra.translate.CGRATemplateRTL_test import * @@ -20,6 +21,7 @@ PORT_EAST = 3 PORT_NORTHWEST = 4 PORT_NORTHEAST = 5 +5555 PORT_SOUTHEAST = 6 PORT_SOUTHWEST = 7 PORT_DIRECTION_COUNTS = 8 @@ -92,7 +94,7 @@ kernelOptions.set("Not selected yet") synthesisRunning = False - +##这个类给出了Tile的一些参数信息## class ParamTile: def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): s.ID = ID @@ -109,7 +111,7 @@ def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): s.fuDict = {} s.xbarDict = {} s.mapping = {} - + #初始化实例 for i in range( PORT_DIRECTION_COUNTS ): s.neverUsedOutPorts.add(i) @@ -118,19 +120,19 @@ def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): for fuType in fuTypeList: s.fuDict[fuType] = 1 - + #是否存在来自内存的输入链路 def hasFromMem(s): for link in s.inLinks.values(): if not link.disabled and link.isFromMem(): return True return False - + #是否存在指向内存的输出链路 def hasToMem(s): for link in s.outLinks.values(): if not link.disabled and link.isToMem(): return True return False - + #获取无效的输入端口 def getInvalidInPorts(s): invalidInPorts = set() for port in range(PORT_DIRECTION_COUNTS): @@ -142,13 +144,13 @@ def getInvalidInPorts(s): invalidInPorts.add(port) continue return invalidInPorts - + #检查是否所有的功能单元(Function Units)是默认的 def isDefaultFus(s): for fuType in fuTypeList: if s.fuDict[fuType] != 1: return False return True - + #获取所有有效的功能单元的类型 def getAllValidFuTypes(s): fuTypes = set() for fuType in fuTypeList: @@ -158,7 +160,7 @@ def getAllValidFuTypes(s): else: fuTypes.add(fuType) return list(fuTypes) - + #获取无效的输出端口 def getInvalidOutPorts(s): invalidOutPorts = set() for port in range(PORT_DIRECTION_COUNTS): @@ -170,7 +172,7 @@ def getInvalidOutPorts(s): invalidOutPorts.add(port) continue return invalidOutPorts - + #重置Tile的状态 def reset(s): s.disabled = False s.mapping = {} @@ -183,27 +185,27 @@ def reset(s): for fuType in fuTypeList: s.fuDict[fuType] = 1 - + #重置出链路(指定端口类型的) def resetOutLink(s, portType, link): s.outLinks[portType] = link s.xbarDict[xbarPort2Type[portType]] = 1 if portType in s.neverUsedOutPorts: s.neverUsedOutPorts.remove(portType) - + #重置入链路(指定端口类型的) def resetInLink(s, portType, link): s.inLinks[portType] = link - + #设置出链路(指定端口类型的) def setOutLink(s, portType, link): s.outLinks[portType] = link - + #设置入链路(指定端口类型的) def setInLink(s, portType, link): s.resetInLink(portType, link) - # position X/Y for drawing the tile + #获取绘制Tile的位置XY坐标 def getPosXY(s, baseX=0, baseY=0): return (baseX+s.posX, baseY+s.posY) - # position X/Y for connecting routing ports + #获取连接端口位置的XY坐标(要指定端口类型) def getPosXYOnPort(s, portType, baseX=0, baseY=0): if portType == PORT_NORTH: return s.getNorth(baseX, baseY) @@ -221,7 +223,7 @@ def getPosXYOnPort(s, portType, baseX=0, baseY=0): return s.getSouthEast(baseX, baseY) else: return s.getSouthWest(baseX, baseY) - + #以下八个函数分别获取指定Tile八个角的位置XY坐标 def getNorthWest(s, baseX=0, baseY=0): return (baseX+s.posX, baseY+s.posY) @@ -245,10 +247,10 @@ def getNorth(s, baseX=0, baseY=0): def getSouth(s, baseX=0, baseY=0): return (baseX+s.posX+s.width//2, baseY+s.posY+s.height) - + #返回Tile的维度 def getDimXY(s): return s.dimX, s.dimY - + #得到Tile的索引,从左到右从下到上依次增加。 def getIndex(s, tileList): if s.disabled: return -1 @@ -260,7 +262,7 @@ def getIndex(s, tileList): index += 1 return index - +##这个类描述了数据存储和处理模块## class ParamSPM: def __init__(s, posX, numOfReadPorts, numOfWritePorts): s.posX = posX @@ -270,7 +272,7 @@ def __init__(s, posX, numOfReadPorts, numOfWritePorts): s.disabled = False s.inLinks = {} s.outLinks = {} - + #返回有效读取端口的数量 def getNumOfValidReadPorts(s): ports = 0 for physicalPort in range(s.numOfReadPorts): @@ -280,7 +282,7 @@ def getNumOfValidReadPorts(s): continue ports += 1 return ports - + #返回有效写入端口的数量 def getNumOfValidWritePorts(s): ports = 0 for physicalPort in range(s.numOfWritePorts): @@ -290,7 +292,7 @@ def getNumOfValidWritePorts(s): continue ports += 1 return ports - + #返回有效读取端口(指定逻辑端口的) def getValidReadPort(s, logicalPort): port = 0 for physicalPort in range(logicalPort+1): @@ -302,7 +304,7 @@ def getValidReadPort(s, logicalPort): return port port += 1 return -1 - + #返回有效写入端口(指定逻辑端口的) def getValidWritePort(s, logicalPort): port = 0 for physicalPort in range(logicalPort+1): @@ -314,22 +316,22 @@ def getValidWritePort(s, logicalPort): return port port += 1 return -1 - + #返回位置坐标X def getPosX(s, baseX): return s.posX + baseX - + #设置输入链接 def setInLink(s, portType, link): s.inLinks[portType] = link - + #重置输入链接 def resetInLink(s, portType, link): s.setInLink(portType, link) - + #设置输出链接 def setOutLink(s, portType, link): s.outLinks[portType] = link - + #重置输出链接 def resetOutLink(s, portType, link): s.setOutLink(portType, link) - +##这是一个表示两个组件之间连接的类## class ParamLink: def __init__(s, srcTile, dstTile, srcPort, dstPort): s.srcTile = srcTile @@ -340,25 +342,25 @@ def __init__(s, srcTile, dstTile, srcPort, dstPort): s.srcTile.resetOutLink(s.srcPort, s) s.dstTile.resetInLink(s.dstPort, s) s.mapping = set() - + #返回内存读取端口(与连接实例相关联的) def getMemReadPort(s): if s.isFromMem(): spm = s.srcTile return spm.getValidReadPort(s.srcPort) return -1 - + #返回内存写入端口(与连接实例相关联的) def getMemWritePort(s): if s.isToMem(): spm = s.dstTile return spm.getValidWritePort(s.dstPort) return -1 - + #判断连接实例是否指向内存(是SPM类型则为True) def isToMem(s): return type(s.dstTile) == ParamSPM - + #判断连接实例是否来自内存(是SPM类型则为True) def isFromMem(s): return type(s.srcTile) == ParamSPM - + #返回连接源端口的XY坐标(需判断是否为SPM类型) def getSrcXY(s, baseX=0, baseY=0): if type(s.srcTile) != ParamSPM: return s.srcTile.getPosXYOnPort(s.srcPort, baseX, baseY) @@ -366,7 +368,7 @@ def getSrcXY(s, baseX=0, baseY=0): dstPosX, dstPosY = s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) spmPosX = s.srcTile.getPosX(baseX) return spmPosX, dstPosY - + #返回连接目标端口的XY坐标(需判断是否为SPM类型) def getDstXY(s, baseX=0, baseY=0): if type(s.dstTile) != ParamSPM: return s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) @@ -375,7 +377,7 @@ def getDstXY(s, baseX=0, baseY=0): spmPosX = s.dstTile.getPosX(baseX) return spmPosX, srcPosY - +##这个类表示参数化的CGRA,是个较庞大的大类## class ParamCGRA: def __init__(s, rows, columns, configMemSize=CONFIG_MEM_SIZE, dataMemSize=DATA_MEM_SIZE): s.rows = rows @@ -428,21 +430,21 @@ def getErrorMessage(s): return "At least one tile including a Load/Store functional unit needs to directly connect to the data SPM." return "" - + #得到有效的Tiles def getValidTiles(s): validTiles = [] for tile in s.tiles: if not tile.disabled: validTiles.append(tile) return validTiles - + #得到有效的连接 def getValidLinks(s): validLinks = [] for link in s.updatedLinks: if not link.disabled and not link.srcTile.disabled and not link.dstTile.disabled: validLinks.append(link) return validLinks - + #更新功能单元与交叉栏的面板 def updateFuXbarPannel(s): targetTile = s.getTileOfID(s.targetTileID) for fuType in fuTypeList: @@ -452,28 +454,28 @@ def updateFuXbarPannel(s): for xbarType in xbarTypeList: if xbarType in xbarCheckVars: xbarCheckVars[xbarType].set(targetTile.xbarDict[xbarType]) - + #初始化数据SPM def initDataSPM(s, dataSPM): s.dataSPM = dataSPM - + #更新配置内存和数据内存的大小 def updateMemSize(s, configMemSize, dataMemSize): s.configMemSize = configMemSize s.dataMemSize = dataMemSize - + #初始化Tiles列表 def initTiles(s, tiles): for r in range(s.rows): for c in range(s.columns): s.tiles.append(tiles[r][c]) - + #添加Tile def addTile(s, tile): s.tiles.append(tile) - + #初始化模板连接列表 def initTemplateLinks(s, links): numOfLinks = s.rows*s.columns*2 + (s.rows-1)*s.columns*2 + (s.rows-1)*(s.columns-1)*2*2 for link in links: s.templateLinks.append(link) - + #重置Tiles的状态 def resetTiles(s): for tile in s.tiles: @@ -487,11 +489,11 @@ def resetTiles(s): xbarCheckVars[xbarType].set(tile.xbarDict[xbarType]) xbarCheckbuttons[xbarType].configure(state="normal") - + #启用所有的模板连接 def enableAllTemplateLinks(s): for link in s.templateLinks: link.disabled = False - + #重置连接的状态 def resetLinks(s): for link in s.templateLinks: link.disabled = False @@ -504,35 +506,35 @@ def resetLinks(s): for portType in range( PORT_DIRECTION_COUNTS ): if portType in s.getTileOfID(s.targetTileID).neverUsedOutPorts: xbarCheckbuttons[xbarPort2Type[portType]].configure(state="disabled") - + #添加模板连接(针对s的templateLinks列表) def addTemplateLink(s, link): s.templateLinks.append(link) - + #添加更新后的连接(针对s的updatedLinks列表) def addUpdatedLink(s, link): s.updatedLinks.append(link) - + #移除更新后的连接 def removeUpdatedLink(s, link): s.updatedLinks.remove(link) # src = link.srcTile # src.xbarDict[link.srcPort] = 0 - + #更新功能单元的复选框 def updateFuCheckbutton(s, fuType, value): tile = s.getTileOfID(s.targetTileID) tile.fuDict[fuType] = value - + #更新交叉单元的复选框 def updateXbarCheckbutton(s, xbarType, value): tile = s.getTileOfID(s.targetTileID) tile.xbarDict[xbarType] = value port = xbarType2Port[xbarType] if port in tile.outLinks: tile.outLinks[port].disabled = True if value == 0 else False - + #根据ID找Tile def getTileOfID(s, ID): for tile in s.tiles: if tile.ID == ID: return tile return None - + #根据dimX/Y找Tile def getTileOfDim(s, dimX, dimY): for tile in s.tiles: if tile.dimX == dimX and tile.dimY == dimY: @@ -541,6 +543,7 @@ def getTileOfDim(s, dimX, dimY): # tiles could be disabled due to the disabled links + #更新Tiles状态 def updateTiles(s): unreachableTiles = set() for tile in s.tiles: @@ -555,7 +558,7 @@ def updateTiles(s): for tile in unreachableTiles: tile.disabled = True - + #找到对应连接 def getUpdatedLink(s, srcTile, dstTile): for link in s.updatedLinks: if link.srcTile == srcTile and link.dstTile == dstTile: @@ -563,6 +566,7 @@ def getUpdatedLink(s, srcTile, dstTile): return None # TODO: also need to consider adding back after removing... + #根据一些条件对连接进行处理,并移除一些无效链接,不过也需要考虑移除后该怎么加回来。 def updateLinks(s): needRemoveLinks = set() @@ -617,7 +621,7 @@ def updateLinks(s): link.disabled = True if type(link.srcTile) == ParamTile: link.srcTile.xbarDict[xbarPort2Type[link.srcPort]] = 0 - + ##这个类用来在GUI小部件上显示工具提示## class ToolTip(object): def __init__(self, widget): @@ -625,7 +629,7 @@ def __init__(self, widget): self.tipwindow = None self.id = None self.x = self.y = 0 - +#用来在工具窗口中显示文本 def showtip(self, text): "Display text in tooltip window" self.text = text @@ -641,13 +645,13 @@ def showtip(self, text): background="#ffffe0", relief=tkinter.SOLID, borderwidth=1, font=("tahoma", "8", "normal")) label.pack(ipadx=1) - +#用来隐藏工具窗口 def hidetip(self): tw = self.tipwindow self.tipwindow = None if tw: tw.destroy() - +#用来创建工具栏显示工具提示 def CreateToolTip(widget, text): toolTip = ToolTip(widget) def enter(event): @@ -660,7 +664,7 @@ def leave(event): paramCGRA = ParamCGRA(ROWS, COLS, CONFIG_MEM_SIZE, DATA_MEM_SIZE) - +#在GUI中点击特定Tile后的发生 def clickTile(ID): widgets["fuConfigPannel"].config(text='Tile '+str(ID)+' functional units') widgets["xbarConfigPannel"].config(text='Tile '+str(ID)+' crossbar outgoing links') @@ -680,7 +684,7 @@ def clickTile(ID): entireTileCheckVar.set(1 if paramCGRA.getTileOfID(ID).disabled else 0) - +#在GUI中点击SPM后的发生 def clickSPM(): widgets["fuConfigPannel"].config(text='Tile '+str(paramCGRA.targetTileID)+' functional units') @@ -699,7 +703,7 @@ def clickSPM(): widgets["entireTileCheckbutton"].config(text='Disable entire Tile '+str(paramCGRA.targetTileID), state="disabled") - +#点击禁用SPM端口 def clickSPMPortDisable(): spmEnabledListbox = widgets["spmEnabledListbox"] portIndex = spmEnabledListbox.curselection() @@ -711,6 +715,7 @@ def clickSPMPortDisable(): link = paramCGRA.dataSPM.outLinks[port] link.disabled = True +#点击启用SPM端口 def clickSPMPortEnable(): spmDisabledListbox = widgets["spmDisabledListbox"] portIndex = spmDisabledListbox.curselection() @@ -723,7 +728,7 @@ def clickSPMPortEnable(): link = paramCGRA.dataSPM.outLinks[port] link.disabled = False - +#点击GUI中整个Tile的复选框 def clickEntireTileCheckbutton(): if entireTileCheckVar.get() == 1: @@ -746,7 +751,7 @@ def clickEntireTileCheckbutton(): # paramCGRA.getTileOfID(paramCGRA.targetTileID).disabled = False - +#处理点击FU的复选框 def clickFuCheckbutton(fuType): if fuType == "Ld": fuCheckVars["St"].set(fuCheckVars["Ld"].get()) @@ -755,11 +760,11 @@ def clickFuCheckbutton(fuType): fuCheckVars["Ld"].set(fuCheckVars["St"].get()) paramCGRA.updateFuCheckbutton("Ld", fuCheckVars["Ld"].get()) paramCGRA.updateFuCheckbutton(fuType, fuCheckVars[fuType].get()) - +#处理点击交叉开关的复选框 def clickXbarCheckbutton(xbarType): paramCGRA.updateXbarCheckbutton(xbarType, xbarCheckVars[xbarType].get()) - +#点击更新后的操作 def clickUpdate(root): rows = int(widgets["rowsEntry"].get()) columns = int(widgets["columnsEntry"].get()) @@ -794,7 +799,7 @@ def clickUpdate(root): else: widgets["resMIIEntry"].insert(0, 0) - +#点击重置后的操作 def clickReset(root): rows = int(widgets["rowsEntry"].get()) columns = int(widgets["columnsEntry"].get()) @@ -840,7 +845,7 @@ def clickReset(root): else: widgets["resMIIEntry"].insert(0, 0) - +#点击测试后的操作 def clickTest(): # need to provide the paths for lib.so and kernel.bc os.system("mkdir test") @@ -873,7 +878,7 @@ def clickTest(): os.chdir("..") - +#点击生成部分的操作 def clickGenerateVerilog(): message = paramCGRA.getErrorMessage() @@ -908,10 +913,10 @@ def clickGenerateVerilog(): os.chdir("..") - +#设置进度报告,管理进度条 def setReportProgress(value): widgets["reportProgress"].configure(value=value) - +#计数合成次数 def countSynthesisTime(): global synthesisRunning timeCost = 0.0 @@ -920,7 +925,7 @@ def countSynthesisTime(): widgets["synthesisTimeEntry"].delete(0, tkinter.END) widgets["synthesisTimeEntry"].insert(0, round(timeCost, 1)) timeCost += 0.1 - +#运行Yosys def runYosys(): global synthesisRunning os.system("make 3") @@ -948,7 +953,7 @@ def runYosys(): synthesisRunning = False - +#点击合成按钮后 def clickSynthesize(): global paramCGRA @@ -1042,7 +1047,7 @@ def clickSynthesize(): yosysRun = threading.Thread(target=runYosys) yosysRun.start() - +#点击选择App后 def clickSelectApp(event): global paramCGRA paramCGRA.compilationDone = False @@ -1055,7 +1060,8 @@ def clickSelectApp(event): # widgets["appPathEntry"].configure(state="disabled") widgets["compileAppShow"].config(text="IDLE", fg='grey') - +#点击编译App后 +##关键步骤## def clickCompileApp(): global paramCGRA fileName = paramCGRA.targetAppName @@ -1110,14 +1116,14 @@ def clickCompileApp(): widgets["generateDFGShow"].config(text="IDLE", fg='grey') os.chdir("..") - +#点击Kernel菜单目录后 def clickKernelMenu(*args): global paramCGRA name = kernelOptions.get() if name == None or name == " " or name == "Not selected yet": return paramCGRA.targetKernelName = name - +#将ParamCGRA对象的信息转化为JSON格式的文件并存储 def dumpParamCGRA2JSON(fileName): global paramCGRA paramCGRAJson = {} @@ -1160,7 +1166,7 @@ def dumpParamCGRA2JSON(fileName): outfile.write(paramCGRAJsonObject) - +#点击呈现DFG图的按钮 def clickShowDFG(): os.system("mkdir kernel") os.chdir("kernel") @@ -1241,7 +1247,7 @@ def clickShowDFG(): os.chdir("..") mappingProc = None - +#计数映射次数 def countMapTime(): global mappingProc timeCost = 0.0 @@ -1250,7 +1256,7 @@ def countMapTime(): widgets["mapTimeEntry"].delete(0, tkinter.END) widgets["mapTimeEntry"].insert(0, round(timeCost, 1)) timeCost += 0.1 - +#描绘调度情况 def drawSchedule(): global mappingProc mappingCommand = "opt-12 -load ../../CGRA-Mapper/build/src/libmapperPass.so -mapperPass ./kernel.bc" @@ -1345,6 +1351,7 @@ def drawSchedule(): baseX += GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + 20 canvas.create_line(baseX-5, INTERVAL, baseX-5, GRID_HEIGHT, width=2, dash=(10,2)) +#点击得到最终映射方案的按钮 def clickTerminateMapping(): global mappingProc if mappingProc == None: @@ -1357,7 +1364,7 @@ def clickTerminateMapping(): if path.split("\\")[-1] == "kernel": os.chdir("..") - +#点击映射DFG图的按钮 def clickMapDFG(): global mappingProc mappingProc = None @@ -1416,7 +1423,8 @@ def clickMapDFG(): timer = threading.Thread(target=countMapTime) timer.start() - +##——————以下可能与作图等相关——————## +#建立一个面板,与CGRA相关的含有图块和连接线 def create_cgra_pannel(root, rows, columns): ROWS = rows @@ -1527,7 +1535,7 @@ def create_cgra_pannel(root, rows, columns): dstX, dstY = link.getDstXY() canvas.create_line(srcX, srcY, dstX, dstY, arrow=tkinter.LAST) - +#放置FU显示框 def place_fu_options(master): fuCount = len(fuTypeList) for i in range(len(fuTypeList)): @@ -1538,7 +1546,7 @@ def place_fu_options(master): fuCheckbutton.select() paramCGRA.updateFuCheckbutton(fuTypeList[i], fuVar.get()) fuCheckbutton.grid(row=i//4, column=i%4, padx=3, pady=3, sticky="W") - +#放置xbar显示框 def place_xbar_options(master): for i in range(PORT_DIRECTION_COUNTS): portType = i @@ -1558,7 +1566,8 @@ def place_xbar_options(master): xbarCheckbutton.grid(row=i//4, column=i%4, padx=BORDER, pady=BORDER, sticky="W") - +#这个函数创建了参数面板,也是GUI的主体内容 +#需要着重修改的部分 def create_param_pannel(master, x, width, height): paramPannel = tkinter.LabelFrame(master, text='Configuration', bd=BORDER, relief='groove') paramPannel.place(height=height, width=width, x=x, y=INTERVAL) @@ -1706,7 +1715,7 @@ def create_param_pannel(master, x, width, height): else: spmDisabledListbox.insert(0, port) - +#与测试部分界面有关,需要修改里面的宽高等参数 def create_test_pannel(master, x, width, height): testPannel = tkinter.LabelFrame(master, text='Verification', bd = BORDER, relief='groove') testPannel.place(height=height, width=width, x=x, y=INTERVAL) @@ -1719,7 +1728,7 @@ def create_test_pannel(master, x, width, height): testShow = tkinter.Label(testPannel, text = " IDLE ", fg='gray') widgets["testShow"] = testShow testShow.grid(row=0, column=2, padx=BORDER, pady=BORDER//2) - +#与verilog语言部分有关,修改里面的宽高等参数 def create_verilog_pannel(master, x, y, width, height): verilogPannel = tkinter.LabelFrame(master, text="SVerilog", bd=BORDER, relief="groove") verilogPannel.place(height=height, width=width, x=x, y=y) @@ -1740,7 +1749,7 @@ def create_verilog_pannel(master, x, y, width, height): generateVerilogButton = tkinter.Button(verilogPannel, text="Generate", relief='raised', command=clickGenerateVerilog) generateVerilogButton.place(x=width-4*BORDER-90, y=height-8*BORDER-30) - +#报告部分需要修改宽参数 def create_report_pannel(master, x, y, width): reportPannel = tkinter.LabelFrame(master, text='Report area/power', bd = BORDER, relief='groove') reportPannel.place(width=width, height=110, x=x, y=y) @@ -1795,7 +1804,7 @@ def create_report_pannel(master, x, y, width): reportSPMPowerData.place(x=BORDER+230, y=BORDER+58, width=50, height=20) widgets["reportSPMPowerData"] = reportSPMPowerData - +#布局部分需要修改宽高参数 def create_layout_pannel(master, x, width, height): layoutPannel = tkinter.LabelFrame(master, text='Layout', bd = BORDER, relief='groove') layoutPannel.place(height=height, width=width, x=x, y=INTERVAL) @@ -1805,7 +1814,7 @@ def create_layout_pannel(master, x, width, height): X = tkinter.Label(layoutPannel, fg="black") X.pack() - +#kernel部分需要修改宽高参数 def create_kernel_pannel(master, x, y, width, height): kernelPannel = tkinter.LabelFrame(master, text="Kernel", bd=BORDER, relief='groove') kernelPannel.place(height=height+3, width=width, x=x, y=y) @@ -1932,7 +1941,7 @@ def create_kernel_pannel(master, x, y, width, height): mapSpeedupEntry.place(x=4*BORDER+dfgWidth+60, y=360+BORDER) - +#映射部分需要修改宽度参数 def create_mapping_pannel(root, x, y, width): # GRID_WIDTH = (TILE_SIZE+LINK_LENGTH) * COLS - linkLength @@ -1954,7 +1963,8 @@ def create_mapping_pannel(root, x, y, width): mappingCanvas.config(xscrollcommand=hbar.set) mappingCanvas.pack(side=tkinter.LEFT, expand=True, fill=tkinter.BOTH) - +#涉及到GUI界面参数与自适应 +#需要进一步修改 create_cgra_pannel(master, ROWS, COLS) paramPadPosX = GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + INTERVAL * 3 diff --git a/run_docker.sh b/run_docker.sh old mode 100644 new mode 100755 index c18caf4..7b52d54 --- a/run_docker.sh +++ b/run_docker.sh @@ -7,7 +7,7 @@ NIC=$(sudo cat /proc/net/dev | awk 'END {print $1}' | sed 's/^[\t]*//g' | sed 's # Grab the ip address of this box IPADDR=$(ifconfig "$NIC" | grep "inet " | awk '{print $2}') -DISP_NUM=100 # fixed display number to 100 +DISP_NUM=12 # fixed display number to 100 PORT_NUM=$((6000 + DISP_NUM)) @@ -17,8 +17,11 @@ XSOCK=/tmp/.X11-unix sudo docker run \ -it \ - --name=CGRA-Flow \ + --name=CGRA-Flow-v2 \ -v $XSOCK:$XSOCK:rw \ + -v /etc/localtime:/etc/localtime:ro \ -e DISPLAY="$IPADDR":$DISP_NUM \ + -e GDK_SCALE \ + -e GDIK_DPI_SCALE \ $IMAGE diff --git a/script1.py b/script1.py new file mode 100755 index 0000000..3587d6e --- /dev/null +++ b/script1.py @@ -0,0 +1,11 @@ +# This is my first python script. +# It is written to open the environment quickly. +# I hope it is a good example. +# Come on,sir. + +#!/usr/bin/python3 +sudo docker exec -it CGRA-Flow-v2 /bin/bash + +#source /WORK_REPO/venv/bin/activate +#cd CGRA-Flow +#python launchUI.py From 36385e3b72228d0f1bf3f0e3257056fc6456fcb7 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Thu, 25 Apr 2024 11:20:35 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86launchUI.py?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E5=BE=97GUI=E7=95=8C=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E6=9B=B4=E5=90=88=E9=80=82=EF=BC=8C=E5=85=B7?= =?UTF-8?q?=E5=A4=87=E4=B8=80=E5=AE=9A=E7=9A=84=E8=87=AA=E9=80=82=E5=BA=94?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- launchUI.py | 640 +++++++++++++++++++++++----------------------------- 1 file changed, 280 insertions(+), 360 deletions(-) diff --git a/launchUI.py b/launchUI.py index c8444de..8d1ce6f 100644 --- a/launchUI.py +++ b/launchUI.py @@ -11,7 +11,6 @@ from tkinter import filedialog as fd from PIL import Image, ImageTk, ImageFile from functools import partial -from Downloads.OpenCGRA.cgra.translate.CGRARTL_test import test_cgra_universal from VectorCGRA.cgra.translate.CGRATemplateRTL_test import * @@ -21,24 +20,31 @@ PORT_EAST = 3 PORT_NORTHWEST = 4 PORT_NORTHEAST = 5 -5555 PORT_SOUTHEAST = 6 PORT_SOUTHWEST = 7 PORT_DIRECTION_COUNTS = 8 - -LINK_NO_MEM = 0 -LINK_FROM_MEM = 1 -LINK_TO_MEM = 2 - -TILE_HEIGHT = 60 -TILE_WIDTH = 60 -LINK_LENGTH = 40 +#TILE_HEIGHT = 60 +#TILE_WIDTH = 60 +#LINK_LENGTH = 40 +TILE_HEIGHT = 120 +TILE_WIDTH = 120 +LINK_LENGTH = 80 INTERVAL = 10 BORDER = 4 - master = tkinter.Tk() master.title("CGRA-Flow: An Integrated End-to-End Framework for CGRA Exploration, Compilation, and Development") - +master.grid_rowconfigure(0, weight=1) +master.grid_rowconfigure(1, weight=1) +master.grid_rowconfigure(2, weight=1) +master.grid_rowconfigure(3, weight=2) +master.grid_rowconfigure(4, weight=2) +master.grid_rowconfigure(5, weight=2) +master.grid_columnconfigure(0, weight=2) +master.grid_columnconfigure(1, weight=2) +master.grid_columnconfigure(2, weight=1) +master.grid_columnconfigure(3, weight=1) +master.grid_columnconfigure(4, weight=2) +master.grid_columnconfigure(5, weight=2) ROWS = 4 COLS = 4 GRID_WIDTH = (TILE_WIDTH+LINK_LENGTH) * COLS - LINK_LENGTH @@ -85,16 +91,13 @@ images = {} entireTileCheckVar = tkinter.IntVar() mappingAlgoCheckVar = tkinter.IntVar() +kernelOptions = tkinter.StringVar() +kernelOptions.set("Not selected yet") fuCheckVars = {} fuCheckbuttons = {} xbarCheckVars = {} xbarCheckbuttons = {} - -kernelOptions = tkinter.StringVar() -kernelOptions.set("Not selected yet") - synthesisRunning = False -##这个类给出了Tile的一些参数信息## class ParamTile: def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): s.ID = ID @@ -111,7 +114,7 @@ def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): s.fuDict = {} s.xbarDict = {} s.mapping = {} - #初始化实例 + for i in range( PORT_DIRECTION_COUNTS ): s.neverUsedOutPorts.add(i) @@ -120,19 +123,19 @@ def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): for fuType in fuTypeList: s.fuDict[fuType] = 1 - #是否存在来自内存的输入链路 + def hasFromMem(s): for link in s.inLinks.values(): if not link.disabled and link.isFromMem(): return True return False - #是否存在指向内存的输出链路 + def hasToMem(s): for link in s.outLinks.values(): if not link.disabled and link.isToMem(): return True return False - #获取无效的输入端口 + def getInvalidInPorts(s): invalidInPorts = set() for port in range(PORT_DIRECTION_COUNTS): @@ -144,13 +147,13 @@ def getInvalidInPorts(s): invalidInPorts.add(port) continue return invalidInPorts - #检查是否所有的功能单元(Function Units)是默认的 + def isDefaultFus(s): for fuType in fuTypeList: if s.fuDict[fuType] != 1: return False return True - #获取所有有效的功能单元的类型 + def getAllValidFuTypes(s): fuTypes = set() for fuType in fuTypeList: @@ -160,7 +163,7 @@ def getAllValidFuTypes(s): else: fuTypes.add(fuType) return list(fuTypes) - #获取无效的输出端口 + def getInvalidOutPorts(s): invalidOutPorts = set() for port in range(PORT_DIRECTION_COUNTS): @@ -172,7 +175,7 @@ def getInvalidOutPorts(s): invalidOutPorts.add(port) continue return invalidOutPorts - #重置Tile的状态 + def reset(s): s.disabled = False s.mapping = {} @@ -185,27 +188,27 @@ def reset(s): for fuType in fuTypeList: s.fuDict[fuType] = 1 - #重置出链路(指定端口类型的) + def resetOutLink(s, portType, link): s.outLinks[portType] = link s.xbarDict[xbarPort2Type[portType]] = 1 if portType in s.neverUsedOutPorts: s.neverUsedOutPorts.remove(portType) - #重置入链路(指定端口类型的) + def resetInLink(s, portType, link): s.inLinks[portType] = link - #设置出链路(指定端口类型的) + def setOutLink(s, portType, link): s.outLinks[portType] = link - #设置入链路(指定端口类型的) + def setInLink(s, portType, link): s.resetInLink(portType, link) - #获取绘制Tile的位置XY坐标 + # position X/Y for drawing the tile def getPosXY(s, baseX=0, baseY=0): return (baseX+s.posX, baseY+s.posY) - #获取连接端口位置的XY坐标(要指定端口类型) + # position X/Y for connecting routing ports def getPosXYOnPort(s, portType, baseX=0, baseY=0): if portType == PORT_NORTH: return s.getNorth(baseX, baseY) @@ -223,7 +226,7 @@ def getPosXYOnPort(s, portType, baseX=0, baseY=0): return s.getSouthEast(baseX, baseY) else: return s.getSouthWest(baseX, baseY) - #以下八个函数分别获取指定Tile八个角的位置XY坐标 + def getNorthWest(s, baseX=0, baseY=0): return (baseX+s.posX, baseY+s.posY) @@ -247,10 +250,10 @@ def getNorth(s, baseX=0, baseY=0): def getSouth(s, baseX=0, baseY=0): return (baseX+s.posX+s.width//2, baseY+s.posY+s.height) - #返回Tile的维度 + def getDimXY(s): return s.dimX, s.dimY - #得到Tile的索引,从左到右从下到上依次增加。 + def getIndex(s, tileList): if s.disabled: return -1 @@ -262,7 +265,7 @@ def getIndex(s, tileList): index += 1 return index -##这个类描述了数据存储和处理模块## + class ParamSPM: def __init__(s, posX, numOfReadPorts, numOfWritePorts): s.posX = posX @@ -272,7 +275,7 @@ def __init__(s, posX, numOfReadPorts, numOfWritePorts): s.disabled = False s.inLinks = {} s.outLinks = {} - #返回有效读取端口的数量 + def getNumOfValidReadPorts(s): ports = 0 for physicalPort in range(s.numOfReadPorts): @@ -282,7 +285,7 @@ def getNumOfValidReadPorts(s): continue ports += 1 return ports - #返回有效写入端口的数量 + def getNumOfValidWritePorts(s): ports = 0 for physicalPort in range(s.numOfWritePorts): @@ -292,7 +295,7 @@ def getNumOfValidWritePorts(s): continue ports += 1 return ports - #返回有效读取端口(指定逻辑端口的) + def getValidReadPort(s, logicalPort): port = 0 for physicalPort in range(logicalPort+1): @@ -304,7 +307,7 @@ def getValidReadPort(s, logicalPort): return port port += 1 return -1 - #返回有效写入端口(指定逻辑端口的) + def getValidWritePort(s, logicalPort): port = 0 for physicalPort in range(logicalPort+1): @@ -316,22 +319,22 @@ def getValidWritePort(s, logicalPort): return port port += 1 return -1 - #返回位置坐标X + def getPosX(s, baseX): return s.posX + baseX - #设置输入链接 + def setInLink(s, portType, link): s.inLinks[portType] = link - #重置输入链接 + def resetInLink(s, portType, link): s.setInLink(portType, link) - #设置输出链接 + def setOutLink(s, portType, link): s.outLinks[portType] = link - #重置输出链接 + def resetOutLink(s, portType, link): s.setOutLink(portType, link) -##这是一个表示两个组件之间连接的类## + class ParamLink: def __init__(s, srcTile, dstTile, srcPort, dstPort): s.srcTile = srcTile @@ -342,42 +345,48 @@ def __init__(s, srcTile, dstTile, srcPort, dstPort): s.srcTile.resetOutLink(s.srcPort, s) s.dstTile.resetInLink(s.dstPort, s) s.mapping = set() - #返回内存读取端口(与连接实例相关联的) + def getMemReadPort(s): if s.isFromMem(): spm = s.srcTile return spm.getValidReadPort(s.srcPort) return -1 - #返回内存写入端口(与连接实例相关联的) + def getMemWritePort(s): if s.isToMem(): spm = s.dstTile return spm.getValidWritePort(s.dstPort) return -1 - #判断连接实例是否指向内存(是SPM类型则为True) + def isToMem(s): return type(s.dstTile) == ParamSPM - #判断连接实例是否来自内存(是SPM类型则为True) + def isFromMem(s): return type(s.srcTile) == ParamSPM - #返回连接源端口的XY坐标(需判断是否为SPM类型) + def getSrcXY(s, baseX=0, baseY=0): if type(s.srcTile) != ParamSPM: - return s.srcTile.getPosXYOnPort(s.srcPort, baseX, baseY) + posX, posY = s.srcTile.getPosXYOnPort(s.srcPort, baseX, baseY) + #posY += 330 + #posX += 30 + return posX, posY else: dstPosX, dstPosY = s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) spmPosX = s.srcTile.getPosX(baseX) return spmPosX, dstPosY - #返回连接目标端口的XY坐标(需判断是否为SPM类型) + def getDstXY(s, baseX=0, baseY=0): if type(s.dstTile) != ParamSPM: - return s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) + posX, posY = s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) + #posY += 330 + #posX += 30 + return posX, posY else: srcPosX, srcPosY = s.srcTile.getPosXYOnPort(s.srcPort, baseX, baseY) spmPosX = s.dstTile.getPosX(baseX) return spmPosX, srcPosY -##这个类表示参数化的CGRA,是个较庞大的大类## + class ParamCGRA: def __init__(s, rows, columns, configMemSize=CONFIG_MEM_SIZE, dataMemSize=DATA_MEM_SIZE): s.rows = rows @@ -430,21 +439,21 @@ def getErrorMessage(s): return "At least one tile including a Load/Store functional unit needs to directly connect to the data SPM." return "" - #得到有效的Tiles + def getValidTiles(s): validTiles = [] for tile in s.tiles: if not tile.disabled: validTiles.append(tile) return validTiles - #得到有效的连接 + def getValidLinks(s): validLinks = [] for link in s.updatedLinks: if not link.disabled and not link.srcTile.disabled and not link.dstTile.disabled: validLinks.append(link) return validLinks - #更新功能单元与交叉栏的面板 + def updateFuXbarPannel(s): targetTile = s.getTileOfID(s.targetTileID) for fuType in fuTypeList: @@ -454,28 +463,28 @@ def updateFuXbarPannel(s): for xbarType in xbarTypeList: if xbarType in xbarCheckVars: xbarCheckVars[xbarType].set(targetTile.xbarDict[xbarType]) - #初始化数据SPM + def initDataSPM(s, dataSPM): s.dataSPM = dataSPM - #更新配置内存和数据内存的大小 + def updateMemSize(s, configMemSize, dataMemSize): s.configMemSize = configMemSize s.dataMemSize = dataMemSize - #初始化Tiles列表 + def initTiles(s, tiles): for r in range(s.rows): for c in range(s.columns): s.tiles.append(tiles[r][c]) - #添加Tile + def addTile(s, tile): s.tiles.append(tile) - #初始化模板连接列表 + def initTemplateLinks(s, links): numOfLinks = s.rows*s.columns*2 + (s.rows-1)*s.columns*2 + (s.rows-1)*(s.columns-1)*2*2 for link in links: s.templateLinks.append(link) - #重置Tiles的状态 + def resetTiles(s): for tile in s.tiles: @@ -489,11 +498,11 @@ def resetTiles(s): xbarCheckVars[xbarType].set(tile.xbarDict[xbarType]) xbarCheckbuttons[xbarType].configure(state="normal") - #启用所有的模板连接 + def enableAllTemplateLinks(s): for link in s.templateLinks: link.disabled = False - #重置连接的状态 + def resetLinks(s): for link in s.templateLinks: link.disabled = False @@ -506,35 +515,35 @@ def resetLinks(s): for portType in range( PORT_DIRECTION_COUNTS ): if portType in s.getTileOfID(s.targetTileID).neverUsedOutPorts: xbarCheckbuttons[xbarPort2Type[portType]].configure(state="disabled") - #添加模板连接(针对s的templateLinks列表) + def addTemplateLink(s, link): s.templateLinks.append(link) - #添加更新后的连接(针对s的updatedLinks列表) + def addUpdatedLink(s, link): s.updatedLinks.append(link) - #移除更新后的连接 + def removeUpdatedLink(s, link): s.updatedLinks.remove(link) # src = link.srcTile # src.xbarDict[link.srcPort] = 0 - #更新功能单元的复选框 + def updateFuCheckbutton(s, fuType, value): tile = s.getTileOfID(s.targetTileID) tile.fuDict[fuType] = value - #更新交叉单元的复选框 + def updateXbarCheckbutton(s, xbarType, value): tile = s.getTileOfID(s.targetTileID) tile.xbarDict[xbarType] = value port = xbarType2Port[xbarType] if port in tile.outLinks: tile.outLinks[port].disabled = True if value == 0 else False - #根据ID找Tile + def getTileOfID(s, ID): for tile in s.tiles: if tile.ID == ID: return tile return None - #根据dimX/Y找Tile + def getTileOfDim(s, dimX, dimY): for tile in s.tiles: if tile.dimX == dimX and tile.dimY == dimY: @@ -543,7 +552,6 @@ def getTileOfDim(s, dimX, dimY): # tiles could be disabled due to the disabled links - #更新Tiles状态 def updateTiles(s): unreachableTiles = set() for tile in s.tiles: @@ -558,7 +566,7 @@ def updateTiles(s): for tile in unreachableTiles: tile.disabled = True - #找到对应连接 + def getUpdatedLink(s, srcTile, dstTile): for link in s.updatedLinks: if link.srcTile == srcTile and link.dstTile == dstTile: @@ -566,7 +574,6 @@ def getUpdatedLink(s, srcTile, dstTile): return None # TODO: also need to consider adding back after removing... - #根据一些条件对连接进行处理,并移除一些无效链接,不过也需要考虑移除后该怎么加回来。 def updateLinks(s): needRemoveLinks = set() @@ -621,7 +628,8 @@ def updateLinks(s): link.disabled = True if type(link.srcTile) == ParamTile: link.srcTile.xbarDict[xbarPort2Type[link.srcPort]] = 0 - ##这个类用来在GUI小部件上显示工具提示## + + class ToolTip(object): def __init__(self, widget): @@ -629,7 +637,7 @@ def __init__(self, widget): self.tipwindow = None self.id = None self.x = self.y = 0 -#用来在工具窗口中显示文本 + def showtip(self, text): "Display text in tooltip window" self.text = text @@ -645,13 +653,13 @@ def showtip(self, text): background="#ffffe0", relief=tkinter.SOLID, borderwidth=1, font=("tahoma", "8", "normal")) label.pack(ipadx=1) -#用来隐藏工具窗口 + def hidetip(self): tw = self.tipwindow self.tipwindow = None if tw: tw.destroy() -#用来创建工具栏显示工具提示 + def CreateToolTip(widget, text): toolTip = ToolTip(widget) def enter(event): @@ -664,11 +672,11 @@ def leave(event): paramCGRA = ParamCGRA(ROWS, COLS, CONFIG_MEM_SIZE, DATA_MEM_SIZE) -#在GUI中点击特定Tile后的发生 + def clickTile(ID): widgets["fuConfigPannel"].config(text='Tile '+str(ID)+' functional units') widgets["xbarConfigPannel"].config(text='Tile '+str(ID)+' crossbar outgoing links') - widgets["xbarConfigPannel"].grid(columnspan=5, row=5, column=0, padx=BORDER, pady=BORDER) + widgets["xbarConfigPannel"].grid(columnspan=4, row=7, column=0,rowspan=2) widgets["entireTileCheckbutton"].config(text='Disable entire Tile '+str(ID), state="normal") widgets["spmConfigPannel"].grid_forget() paramCGRA.targetTileID = ID @@ -684,7 +692,7 @@ def clickTile(ID): entireTileCheckVar.set(1 if paramCGRA.getTileOfID(ID).disabled else 0) -#在GUI中点击SPM后的发生 + def clickSPM(): widgets["fuConfigPannel"].config(text='Tile '+str(paramCGRA.targetTileID)+' functional units') @@ -696,14 +704,14 @@ def clickSPM(): spmConfigPannel = widgets["spmConfigPannel"] spmConfigPannel.config(text='DataSPM outgoing links') - spmConfigPannel.grid(columnspan=5, row=5, column=0, padx=BORDER, pady=BORDER) + spmConfigPannel.grid(row=7,column=0,rowspan=2,columnspan=4) spmEnabledListbox = widgets["spmEnabledListbox"] spmDisabledListbox = widgets["spmDisabledListbox"] widgets["entireTileCheckbutton"].config(text='Disable entire Tile '+str(paramCGRA.targetTileID), state="disabled") -#点击禁用SPM端口 + def clickSPMPortDisable(): spmEnabledListbox = widgets["spmEnabledListbox"] portIndex = spmEnabledListbox.curselection() @@ -715,7 +723,6 @@ def clickSPMPortDisable(): link = paramCGRA.dataSPM.outLinks[port] link.disabled = True -#点击启用SPM端口 def clickSPMPortEnable(): spmDisabledListbox = widgets["spmDisabledListbox"] portIndex = spmDisabledListbox.curselection() @@ -728,7 +735,7 @@ def clickSPMPortEnable(): link = paramCGRA.dataSPM.outLinks[port] link.disabled = False -#点击GUI中整个Tile的复选框 + def clickEntireTileCheckbutton(): if entireTileCheckVar.get() == 1: @@ -751,7 +758,7 @@ def clickEntireTileCheckbutton(): # paramCGRA.getTileOfID(paramCGRA.targetTileID).disabled = False -#处理点击FU的复选框 + def clickFuCheckbutton(fuType): if fuType == "Ld": fuCheckVars["St"].set(fuCheckVars["Ld"].get()) @@ -760,11 +767,11 @@ def clickFuCheckbutton(fuType): fuCheckVars["Ld"].set(fuCheckVars["St"].get()) paramCGRA.updateFuCheckbutton("Ld", fuCheckVars["Ld"].get()) paramCGRA.updateFuCheckbutton(fuType, fuCheckVars[fuType].get()) -#处理点击交叉开关的复选框 + def clickXbarCheckbutton(xbarType): paramCGRA.updateXbarCheckbutton(xbarType, xbarCheckVars[xbarType].get()) -#点击更新后的操作 + def clickUpdate(root): rows = int(widgets["rowsEntry"].get()) columns = int(widgets["columnsEntry"].get()) @@ -799,7 +806,7 @@ def clickUpdate(root): else: widgets["resMIIEntry"].insert(0, 0) -#点击重置后的操作 + def clickReset(root): rows = int(widgets["rowsEntry"].get()) columns = int(widgets["columnsEntry"].get()) @@ -845,7 +852,7 @@ def clickReset(root): else: widgets["resMIIEntry"].insert(0, 0) -#点击测试后的操作 + def clickTest(): # need to provide the paths for lib.so and kernel.bc os.system("mkdir test") @@ -878,7 +885,7 @@ def clickTest(): os.chdir("..") -#点击生成部分的操作 + def clickGenerateVerilog(): message = paramCGRA.getErrorMessage() @@ -913,10 +920,10 @@ def clickGenerateVerilog(): os.chdir("..") -#设置进度报告,管理进度条 + def setReportProgress(value): widgets["reportProgress"].configure(value=value) -#计数合成次数 + def countSynthesisTime(): global synthesisRunning timeCost = 0.0 @@ -925,7 +932,7 @@ def countSynthesisTime(): widgets["synthesisTimeEntry"].delete(0, tkinter.END) widgets["synthesisTimeEntry"].insert(0, round(timeCost, 1)) timeCost += 0.1 -#运行Yosys + def runYosys(): global synthesisRunning os.system("make 3") @@ -953,7 +960,7 @@ def runYosys(): synthesisRunning = False -#点击合成按钮后 + def clickSynthesize(): global paramCGRA @@ -1047,7 +1054,7 @@ def clickSynthesize(): yosysRun = threading.Thread(target=runYosys) yosysRun.start() -#点击选择App后 + def clickSelectApp(event): global paramCGRA paramCGRA.compilationDone = False @@ -1060,8 +1067,7 @@ def clickSelectApp(event): # widgets["appPathEntry"].configure(state="disabled") widgets["compileAppShow"].config(text="IDLE", fg='grey') -#点击编译App后 -##关键步骤## + def clickCompileApp(): global paramCGRA fileName = paramCGRA.targetAppName @@ -1116,14 +1122,14 @@ def clickCompileApp(): widgets["generateDFGShow"].config(text="IDLE", fg='grey') os.chdir("..") -#点击Kernel菜单目录后 + def clickKernelMenu(*args): global paramCGRA name = kernelOptions.get() if name == None or name == " " or name == "Not selected yet": return paramCGRA.targetKernelName = name -#将ParamCGRA对象的信息转化为JSON格式的文件并存储 + def dumpParamCGRA2JSON(fileName): global paramCGRA paramCGRAJson = {} @@ -1166,7 +1172,7 @@ def dumpParamCGRA2JSON(fileName): outfile.write(paramCGRAJsonObject) -#点击呈现DFG图的按钮 + def clickShowDFG(): os.system("mkdir kernel") os.chdir("kernel") @@ -1247,7 +1253,7 @@ def clickShowDFG(): os.chdir("..") mappingProc = None -#计数映射次数 + def countMapTime(): global mappingProc timeCost = 0.0 @@ -1256,7 +1262,7 @@ def countMapTime(): widgets["mapTimeEntry"].delete(0, tkinter.END) widgets["mapTimeEntry"].insert(0, round(timeCost, 1)) timeCost += 0.1 -#描绘调度情况 + def drawSchedule(): global mappingProc mappingCommand = "opt-12 -load ../../CGRA-Mapper/build/src/libmapperPass.so -mapperPass ./kernel.bc" @@ -1351,7 +1357,6 @@ def drawSchedule(): baseX += GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + 20 canvas.create_line(baseX-5, INTERVAL, baseX-5, GRID_HEIGHT, width=2, dash=(10,2)) -#点击得到最终映射方案的按钮 def clickTerminateMapping(): global mappingProc if mappingProc == None: @@ -1364,7 +1369,7 @@ def clickTerminateMapping(): if path.split("\\")[-1] == "kernel": os.chdir("..") -#点击映射DFG图的按钮 + def clickMapDFG(): global mappingProc mappingProc = None @@ -1423,18 +1428,25 @@ def clickMapDFG(): timer = threading.Thread(target=countMapTime) timer.start() -##——————以下可能与作图等相关——————## -#建立一个面板,与CGRA相关的含有图块和连接线 -def create_cgra_pannel(root, rows, columns): + + +def create_cgra_pannel(master, rows, columns): ROWS = rows COLS = columns TILE_WIDTH = (GRID_WIDTH + LINK_LENGTH) / COLS - LINK_LENGTH TILE_HEIGHT = (GRID_HEIGHT + LINK_LENGTH) / ROWS - LINK_LENGTH - totalWidth = GRID_WIDTH+MEM_WIDTH+LINK_LENGTH - canvas = tkinter.Canvas(root, bd=5, height=GRID_HEIGHT, width=totalWidth) - canvas.place(x=INTERVAL, y=INTERVAL) + canvas = tkinter.Canvas(master) + canvas.grid(row=0,column=0,rowspan=3,columnspan=2,sticky="nsew") + #vertical_scrollbar = tkinter.Scrollbar(master,orient="vertical",command=canvas.yview) + #vertical_scrollbar.grid(row=0, column=1, sticky="ns") + #canvas.configure(yscrollcommand=vertical_scrollbar.set) + + #horizontal_scrollbar = tkinter.Scrollbar(master, orient="horizontal", command=canvas.xview) + #horizontal_scrollbar.grid(row=1, column=0, sticky="ew") + #canvas.configure(xscrollcommand=horizontal_scrollbar.set) + #canvas.config(scrollregion=canvas.bbox("all")) # pad contains tile and links # padSize = TILE_SIZE + LINK_LENGTH @@ -1465,8 +1477,6 @@ def create_cgra_pannel(root, rows, columns): # draw tiles for tile in paramCGRA.tiles: - # if tile.disabled: - # button = tkinter.Button(canvas, text = "Tile "+str(tile.ID), fg='gray', relief='flat', bd=BORDER, command=partial(clickTile, tile.ID)) if not tile.disabled: button = tkinter.Button(canvas, text = "Tile "+str(tile.ID), fg='black', bg='gray', relief='raised', bd=BORDER, command=partial(clickTile, tile.ID)) @@ -1534,8 +1544,8 @@ def create_cgra_pannel(root, rows, columns): srcX, srcY = link.getSrcXY() dstX, dstY = link.getDstXY() canvas.create_line(srcX, srcY, dstX, dstY, arrow=tkinter.LAST) - -#放置FU显示框 + + def place_fu_options(master): fuCount = len(fuTypeList) for i in range(len(fuTypeList)): @@ -1545,8 +1555,8 @@ def place_fu_options(master): fuCheckbuttons[fuTypeList[i]] = fuCheckbutton fuCheckbutton.select() paramCGRA.updateFuCheckbutton(fuTypeList[i], fuVar.get()) - fuCheckbutton.grid(row=i//4, column=i%4, padx=3, pady=3, sticky="W") -#放置xbar显示框 + fuCheckbutton.grid(row=i//4, column=i%4, padx=30, pady=30, sticky="nsew") + def place_xbar_options(master): for i in range(PORT_DIRECTION_COUNTS): portType = i @@ -1564,85 +1574,76 @@ def place_xbar_options(master): if portType in paramCGRA.getTileOfID(0).neverUsedOutPorts: xbarCheckbutton.configure(state="disabled") - xbarCheckbutton.grid(row=i//4, column=i%4, padx=BORDER, pady=BORDER, sticky="W") + xbarCheckbutton.grid(row=i//4, column=i%4, padx=30, pady=30, sticky="nsew") + + -#这个函数创建了参数面板,也是GUI的主体内容 -#需要着重修改的部分 -def create_param_pannel(master, x, width, height): +def create_param_pannel(master): paramPannel = tkinter.LabelFrame(master, text='Configuration', bd=BORDER, relief='groove') - paramPannel.place(height=height, width=width, x=x, y=INTERVAL) - - paramPannel.columnconfigure(0, weight=3) - paramPannel.columnconfigure(1, weight=1) - paramPannel.columnconfigure(2, weight=100) - paramPannel.columnconfigure(3, weight=1) - paramPannel.columnconfigure(4, weight=100) - - rowsLabel = tkinter.Label(paramPannel, text='Rows & Columns:' ) - rowsLabel.grid(columnspan=2, row=0, column=0, sticky=tkinter.W, padx=BORDER, pady=BORDER) + paramPannel.grid(row=0,column=2,rowspan=3,columnspan=1,sticky="nsew") + for i in range(10): + if i < 8: + paramPannel.rowconfigure(i, weight=1) + else: + paramPannel.rowconfigure(i, weight=2) + for i in range(4): + paramPannel.columnconfigure(i,weight=1) + rowsLabel = tkinter.Label(paramPannel, text='Rows Columns:' ) + rowsLabel.grid(columnspan=2, row=0, column=0, sticky=tkinter.W) rowsEntry = tkinter.Entry(paramPannel, justify=tkinter.CENTER) - rowsEntry.grid(row=0, column=2, sticky=tkinter.W, padx=BORDER, pady=BORDER) + rowsEntry.grid(row=0, column=2, sticky=tkinter.W) rowsEntry.insert(0, str(paramCGRA.rows)) widgets["rowsEntry"] = rowsEntry - - xLabel = tkinter.Label(paramPannel, text='&') - xLabel.grid(row=0, column=3, sticky=tkinter.W, padx=BORDER, pady=BORDER) - - # columnsLabel = tkinter.Label(paramPannel, text='Columns:') - # columnsLabel.grid(row=0, column=2, sticky=tkinter.E, padx=BORDER, pady=BORDER) columnsEntry = tkinter.Entry(paramPannel, justify=tkinter.CENTER) - columnsEntry.grid(row=0, column=4, sticky=tkinter.W, padx=BORDER, pady=BORDER) + columnsEntry.grid(row=0, column=3, sticky=tkinter.W) columnsEntry.insert(0, str(paramCGRA.columns)) widgets["columnsEntry"] = columnsEntry configMemLabel = ttk.Label(paramPannel, text='Config Memory (entries/tile):') - configMemLabel.grid(columnspan=4, row=1, column=0, sticky=tkinter.W, padx=BORDER, pady=BORDER) + configMemLabel.grid(columnspan=3, row=1, column=0, sticky=tkinter.W) configMemEntry = ttk.Entry(paramPannel, justify=tkinter.CENTER) - configMemEntry.grid(row=1, column=4, sticky=tkinter.W, padx=BORDER, pady=BORDER) + configMemEntry.grid(row=1, column=3, sticky=tkinter.W) configMemEntry.insert(0, paramCGRA.configMemSize) widgets["configMemEntry"] = configMemEntry dataMemLabel = ttk.Label(paramPannel, text='Data SPM (KBs):') - dataMemLabel.grid(columnspan=2, row=2, column=0, padx=BORDER, pady=BORDER, sticky=tkinter.W) + dataMemLabel.grid(columnspan=2, row=2, column=0,sticky=tkinter.W) dataMemEntry = ttk.Entry(paramPannel, justify=tkinter.CENTER) - dataMemEntry.grid(row=2, column=2, sticky=tkinter.W, padx=BORDER, pady=BORDER) + dataMemEntry.grid(row=2, column=2, sticky=tkinter.W) dataMemEntry.insert(0, str(paramCGRA.dataMemSize)) - widgets["dataMemEntry"] = dataMemEntry - + widgets["dataMemEntry"] = dataMemEntry updateButton = tkinter.Button(paramPannel, text = " Reset ", relief='raised', command = partial(clickReset, master)) - updateButton.grid(columnspan=2, row=2, column=3, sticky=tkinter.W, padx=BORDER) + updateButton.grid(row=2, column=3, sticky=tkinter.W) - # entireTileCheckVar = tkinter.IntVar() entireTileCheckVar.set(0) entireTileCheckbutton = tkinter.Checkbutton(paramPannel, variable=entireTileCheckVar, text="Disable entire Tile 0", command=clickEntireTileCheckbutton) - # entireTileCheckbutton.select() - # paramCGRA.updateEntireTileCheckbutton(fuTypeList[i], fuVar.get()) - entireTileCheckbutton.grid(columnspan=3, row=3, column=0, padx=BORDER, pady=BORDER, sticky="W") + entireTileCheckbutton.grid(columnspan=3, row=3, column=0,sticky="W") widgets["entireTileCheckbutton"] = entireTileCheckbutton - resetButton = tkinter.Button(paramPannel, text = "Update", relief='raised', command = partial(clickUpdate, master)) - resetButton.grid(columnspan=2, row=3, column=3, sticky=tkinter.W, padx=BORDER) + resetButton.grid(row=3, column=3,sticky=tkinter.W) fuConfigPannel = tkinter.LabelFrame(paramPannel, text='Tile 0 functional units', bd = BORDER, relief='groove') - # fuConfigPannel.config(text='xxx') - fuConfigPannel.grid(columnspan=5, row=4, column=0, padx=BORDER, pady=BORDER) - widgets["fuConfigPannel"] = fuConfigPannel - + fuConfigPannel.grid(columnspan=4, row=4, column=0,rowspan=3,sticky="nsew") + widgets["fuConfigPannel"] = fuConfigPannel place_fu_options(fuConfigPannel) - + xbarConfigPannel = tkinter.LabelFrame(paramPannel, text='Tile 0 crossbar outgoing links', bd=BORDER, relief='groove') - # xbarConfigPannel.config(text='y') - xbarConfigPannel.grid(columnspan=5, row=5, column=0, padx=BORDER, pady=BORDER) - # xbarConfigPannel.config(width=width-30, height=80) + xbarConfigPannel.grid(columnspan=4, row=7, column=0,rowspan=2) widgets["xbarConfigPannel"] = xbarConfigPannel - place_xbar_options(xbarConfigPannel) spmConfigPannel = tkinter.LabelFrame(paramPannel, text='Data SPM outgoing links', bd=BORDER, relief='groove') - spmConfigPannel.config(width=225, height=85) - # xbarConfigPannel.config(text='y') + spmConfigPannel.grid(row=7,column=0,rowspan=2,columnspan=4) widgets["spmConfigPannel"] = spmConfigPannel - + for i in range(3): + spmConfigPannel.rowconfigure(i,weight=1) + + spmConfigPannel.columnconfigure(0,weight=2) + spmConfigPannel.columnconfigure(1,weight=1) + spmConfigPannel.columnconfigure(2,weight=2) + spmConfigPannel.columnconfigure(3,weight=1) + spmConfigPannel.columnconfigure(4,weight=2) + spmEnabledOutVar = tkinter.IntVar() spmDisabledOutVar = tkinter.IntVar() @@ -1660,53 +1661,33 @@ def create_param_pannel(master, x, width, height): spmDisableButton = tkinter.Button(spmConfigPannel, text="Disable", relief='raised', command=clickSPMPortDisable) spmEnableButton = tkinter.Button(spmConfigPannel, text="Enable", relief='raised', command=clickSPMPortEnable) - spmEnabledScrollbar.config(command=spmEnabledListbox.yview) spmEnabledListbox.config(yscrollcommand=spmEnabledScrollbar.set) spmDisabledScrollbar.config(command=spmDisabledListbox.yview) spmDisabledListbox.config(yscrollcommand=spmDisabledScrollbar.set) - - # spmEnabledLabel.config(width=50, height=80) - spmEnabledListbox.config(width=50, height=50) - # spmEnabledListbox.place(x=BORDER, y=BORDER, width=0, height=20) - # spmEnabledLabel.grid(rowspan=2, row=0, column=0) - spmEnabledLabel.place(x=0, y=0, width=50, height=60) + spmEnabledLabel.grid(row=0,column=0,rowspan=3,sticky="new") spmEnabledScrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y) spmEnabledListbox.pack() - # spmDisableButton.grid(row=0, column=1) - # spmEnableButton.grid(row=1, column=1) spmDisableArrow0 = tkinter.Label(spmConfigPannel, text="=>") spmDisableArrow1 = tkinter.Label(spmConfigPannel, text="=>") spmEnableArrow0 = tkinter.Label(spmConfigPannel, text="<=") spmEnableArrow1 = tkinter.Label(spmConfigPannel, text="<=") - spmDisableArrow0.place(x=55, y=BORDER, width=20, height=25) - spmDisableButton.place(x=80, y=BORDER, width=60, height=25) - spmDisableArrow1.place(x=145, y=BORDER, width=20, height=25) - - spmEnableArrow0.place(x=55, y=BORDER+30, width=20, height=25) - spmEnableButton.place(x=80, y=BORDER+30, width=60, height=25) - spmEnableArrow1.place(x=145, y=BORDER+30, width=20, height=25) - - # spmEnableButton.pack() + spmDisableArrow0.grid(row=0,column=1,sticky="nsew") + spmDisableButton.grid(row=0,column=2,sticky="nsew") + spmDisableArrow1.grid(row=0,column=3,sticky="nsew") - # spmDisableButton.place(x=30, y=30, width=20, height=20) - # spmEnableButton.place(x=30, y=60, width=20, height=20) + spmEnableArrow0.grid(row=2,column=1,sticky="nsew") + spmEnableButton.grid(row=2,column=2,sticky="nsew") + spmEnableArrow1.grid(row=2,column=3,sticky="nsew") - # spmDisabledListbox.place(x=50, y=BORDER, width=0, height=20) - # spmDisabledLabel.config(width=50, height=80) - spmDisabledListbox.config(width=50, height=50) - spmDisabledLabel.place(x=165, y=0, width=50, height=60) - # spmDisabledLabel.grid(rowspan=2, row=0, column=2) + spmDisabledLabel.grid(row=0,column=4,rowspan=3,sticky="new") spmDisabledScrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y) spmDisabledListbox.pack() - # enabledPorts = [ i for i in range(paramCGRA.dataSPM.ports)] - # enabledPorts.reverse() - spmEnabledListbox.delete(0) spmDisabledListbox.delete(0) for port in paramCGRA.dataSPM.outLinks: @@ -1715,281 +1696,220 @@ def create_param_pannel(master, x, width, height): else: spmDisabledListbox.insert(0, port) -#与测试部分界面有关,需要修改里面的宽高等参数 -def create_test_pannel(master, x, width, height): - testPannel = tkinter.LabelFrame(master, text='Verification', bd = BORDER, relief='groove') - testPannel.place(height=height, width=width, x=x, y=INTERVAL) + + +def create_test_pannel(master): + testPannel = tkinter.LabelFrame(master, text='Verification', bd=BORDER, relief='groove') + testPannel.grid(row=0, column=3, rowspan=1, columnspan=1, sticky="nsew") testButton = tkinter.Button(testPannel, text = "Run tests", relief='raised', command = clickTest) - testButton.grid(row=0, column=0, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) - testProgress = ttk.Progressbar(testPannel, orient='horizontal', mode='determinate', length=width/2.5) + testButton.pack(side=tkinter.LEFT, padx=4, pady=4) + testProgress = ttk.Progressbar(testPannel, orient='horizontal', mode='determinate') testProgress['value'] = 0 widgets["testProgress"] = testProgress - testProgress.grid(row=0, column=1, padx=BORDER, pady=BORDER//2) + testProgress.pack(side=tkinter.LEFT, fill="x", padx=4, expand=True) testShow = tkinter.Label(testPannel, text = " IDLE ", fg='gray') widgets["testShow"] = testShow - testShow.grid(row=0, column=2, padx=BORDER, pady=BORDER//2) -#与verilog语言部分有关,修改里面的宽高等参数 -def create_verilog_pannel(master, x, y, width, height): + testShow.pack(side=tkinter.RIGHT, padx=4,pady=4) + +def create_verilog_pannel(master): verilogPannel = tkinter.LabelFrame(master, text="SVerilog", bd=BORDER, relief="groove") - verilogPannel.place(height=height, width=width, x=x, y=y) + verilogPannel.grid(row=1, column=3, rowspan=1, columnspan=1, sticky="nesw") CreateToolTip(verilogPannel, text = "The code might be too big to be copied,\nthe generated verilog can be found in\nthe 'verilog' folder.") - - verilogFrame = tkinter.Frame(verilogPannel, bd=BORDER, relief="groove") - verilogFrame.place(height=height-8*BORDER-40, width=width-4*BORDER, x=BORDER, y=BORDER) - - verilogScroll=tkinter.Scrollbar(verilogFrame, orient="vertical") + generateVerilogButton = tkinter.Button(verilogPannel, text="Generate", relief='raised', command=clickGenerateVerilog) + generateVerilogButton.pack(side=tkinter.BOTTOM, anchor="se", padx=BORDER, pady=BORDER) + verilogScroll = tkinter.Scrollbar(verilogPannel, orient="vertical") verilogScroll.pack(side=tkinter.RIGHT, fill="y") - - # verilogText = tkinter.Text(verilogPannel, bd = BORDER, relief='groove', yscrollcommand=v.set) - verilogText = tkinter.Text(verilogFrame, yscrollcommand=verilogScroll.set) + verilogText = tkinter.Text(verilogPannel, yscrollcommand=verilogScroll.set,width=30,height=5) + verilogText.pack(side=tkinter.LEFT, fill="both", expand=True) + verilogText.config(yscrollcommand=verilogScroll.set) verilogScroll.config(command=verilogText.yview) widgets["verilogText"] = verilogText - verilogText.pack() - - generateVerilogButton = tkinter.Button(verilogPannel, text="Generate", relief='raised', command=clickGenerateVerilog) - generateVerilogButton.place(x=width-4*BORDER-90, y=height-8*BORDER-30) - -#报告部分需要修改宽参数 -def create_report_pannel(master, x, y, width): + +def create_report_pannel(master): reportPannel = tkinter.LabelFrame(master, text='Report area/power', bd = BORDER, relief='groove') - reportPannel.place(width=width, height=110, x=x, y=y) - + reportPannel.grid(row=2,column=3,rowspan=1,columnspan=1,sticky='nw') + reportPannel.grid_configure(rows=3, columns=4) reportButton = tkinter.Button(reportPannel, text="Synthesize", relief="raised", command=clickSynthesize) - # reportButton.grid(row=0, column=0, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) - reportButton.place(x=BORDER, y=BORDER, width=90, height=28) - # reportProgress = ttk.Progressbar(reportPannel, orient='horizontal', mode='determinate', length=width/1.7) + reportProgress = ttk.Progressbar(reportPannel, orient="horizontal", mode="determinate") reportProgress['value'] = 0 widgets["reportProgress"] = reportProgress - # reportProgress.grid(columnspan=2, row=0, column=1, padx=BORDER, pady=BORDER//2) - reportProgress.place(x=BORDER+100, y=BORDER*2, width=120, height=20) synthesisTimeEntry = tkinter.Entry(reportPannel, fg="black", justify=tkinter.CENTER) widgets["synthesisTimeEntry"] = synthesisTimeEntry - synthesisTimeEntry.place(x=BORDER+230, y=BORDER*2, width=50, height=20) - # synthesisTimeEntry.insert(0, "0") - # synthesisTimeEntry.configure(width=4) - # synthesisTimeEntry.grid(row=0, column=3, padx=BORDER, pady=BORDER//2) - + reportTileAreaLabel = tkinter.Label(reportPannel, text = " Tiles area:") CreateToolTip(reportTileAreaLabel, text = "Area is in mm^2.") - reportTileAreaLabel.place(x=BORDER, y=BORDER+30, width=70, height=25) reportTileAreaData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportTileAreaData"] = reportTileAreaData - reportTileAreaData.place(x=BORDER+80, y=BORDER+32, width=50, height=20) reportTilePowerLabel = tkinter.Label(reportPannel, text = "Tiles power:") CreateToolTip(reportTilePowerLabel, text = "Yosys is not able to provide\npower estimation.") - reportTilePowerLabel.grid(row=1, column=2, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) - reportTilePowerLabel.place(x=BORDER+140, y=BORDER+30, width=80, height=25) reportTilePowerData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportTilePowerData"] = reportTilePowerData - reportTilePowerData.place(x=BORDER+230, y=BORDER+32, width=50, height=20) reportSPMAreaLabel = tkinter.Label(reportPannel, text = " SPM area:") CreateToolTip(reportSPMAreaLabel, text = "Area is in mm^2.") - reportSPMAreaLabel.place(x=BORDER, y=BORDER+56, width=70, height=25) reportSPMAreaData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) - reportSPMAreaData.place(x=BORDER+80, y=BORDER+58, width=50, height=20) widgets["reportSPMAreaData"] = reportSPMAreaData reportSPMPowerLabel = tkinter.Label(reportPannel, text = "SPM power:") CreateToolTip(reportSPMPowerLabel, text = "Power is in mW.") - reportSPMPowerLabel.place(x=BORDER+140, y=BORDER+56, width=80, height=25) reportSPMPowerData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) - reportSPMPowerData.place(x=BORDER+230, y=BORDER+58, width=50, height=20) widgets["reportSPMPowerData"] = reportSPMPowerData - -#布局部分需要修改宽高参数 -def create_layout_pannel(master, x, width, height): - layoutPannel = tkinter.LabelFrame(master, text='Layout', bd = BORDER, relief='groove') - layoutPannel.place(height=height, width=width, x=x, y=INTERVAL) + + reportButton.grid(row=0, column=0) + reportProgress.grid(row=0,column=1,columnspan=2) + synthesisTimeEntry.grid(row=0, column=3) + + reportTileAreaLabel.grid(row=1, column=0) + reportTileAreaData.grid(row=1, column=1) + reportTilePowerLabel.grid(row=1, column=2) + reportTilePowerData.grid(row=1, column=3) + + reportSPMAreaLabel.grid(row=2, column=0) + reportSPMAreaData.grid(row=2, column=1) + reportSPMPowerLabel.grid(row=2, column=2) + reportSPMPowerData.grid(row=2, column=3) + +def create_layout_pannel(master): + layoutPannel = tkinter.LabelFrame(master, text='Layout', bd=BORDER, relief='groove') + layoutPannel.grid(row=0, column=4,rowspan=3,columnspan=2, sticky="nsew") + canvas = tkinter.Canvas(layoutPannel, bd=0) + scrollbar = tkinter.Scrollbar(layoutPannel, orient="horizontal", command=canvas.xview) + scrollbar.pack(side="bottom", fill="x") + canvas.config(xscrollcommand=scrollbar.set) + canvas.pack(side="top", fill="both", expand=True) + layout_frame = tkinter.Frame(canvas) + canvas.create_window((0, 0), window=layout_frame, anchor="nw") showButton = tkinter.Button(layoutPannel, text = "Display layout", relief='raised') CreateToolTip(showButton, text = "The layout demonstration is\nunder development.") - showButton.pack() - X = tkinter.Label(layoutPannel, fg="black") + showButton.place(relx=0.5, rely=0.05, anchor="center") + X = tkinter.Label(layout_frame, fg="black") X.pack() -#kernel部分需要修改宽高参数 -def create_kernel_pannel(master, x, y, width, height): +def create_mapping_pannel(master): + mappingPannel = tkinter.LabelFrame(master, text='Mapping', bd=BORDER, relief='groove') + mappingPannel.grid(row=3, column=3, rowspan=3,columnspan=4, sticky="nsew") + canvas = tkinter.Canvas(mappingPannel, bd=0) + scrollbar = tkinter.Scrollbar(mappingPannel, orient="horizontal", command=canvas.xview) + scrollbar.pack(side="bottom", fill="x") + canvas.config(xscrollcommand=scrollbar.set) + canvas.pack(side="top", fill="both", expand=True) + +def create_kernel_pannel(master): kernelPannel = tkinter.LabelFrame(master, text="Kernel", bd=BORDER, relief='groove') - kernelPannel.place(height=height+3, width=width, x=x, y=y) + kernelPannel.grid(row=3,column=0,rowspan=3,columnspan=3,sticky="nsew") + for row in range(12): + kernelPannel.grid_rowconfigure(row, weight=1) + kernelPannel.grid_columnconfigure(0, weight=3) + kernelPannel.grid_columnconfigure(1, weight=2) + kernelPannel.grid_columnconfigure(2, weight=2) + kernelPannel.grid_columnconfigure(3, weight=1) selectAppLabel = tkinter.Label(kernelPannel, text=" Application:", fg='black') - selectAppLabel.grid(row=0, column=0, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + selectAppLabel.grid(row=0, column=0, sticky="nsew") appPathEntry = tkinter.Entry(kernelPannel, fg="black") widgets["appPathEntry"] = appPathEntry - appPathEntry.configure(width=16) - appPathEntry.insert(0, paramCGRA.targetAppName) - # appPathEntry.configure(state="disabled") - appPathEntry.grid(columnspan=2, row=0, column=1, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + appPathEntry.grid(row=0, column=1, sticky="nsew") appPathEntry.bind("", clickSelectApp) compileAppButton = tkinter.Button(kernelPannel, text=" Compile app ", fg="black", command=clickCompileApp) - compileAppButton.configure(width=10) - compileAppButton.grid(row=0, column=3, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + compileAppButton.grid(row=0, column=2,sticky=tkinter.E) - # compileAppShow = tkinter.Label(kernelPannel, text=u' \u2713\u2713\u2713', fg='green') compileAppShow = tkinter.Label(kernelPannel, text=" IDLE", fg='gray') - compileAppShow.grid(row=0, column=4, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + compileAppShow.grid(row=0, column=3, sticky="ew") widgets["compileAppShow"] = compileAppShow kernelNameLabel = tkinter.Label(kernelPannel, text=" Kernel name:", fg='black') - kernelNameLabel.grid(row=1, column=0, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + kernelNameLabel.grid(row=1, column=0, sticky="nsew") tempOptions = [ "Not selected yet" ] kernelNameMenu = tkinter.OptionMenu(kernelPannel, kernelOptions, *tempOptions) - kernelOptions.trace("w", clickKernelMenu) widgets["kernelNameMenu"] = kernelNameMenu - kernelNameMenu.configure(width=12) - kernelNameMenu.grid(columnspan=2, row=1, column=1, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) - - # kernelNameEntry= tkinter.Entry(kernelPannel, fg="black") - # widgets["kernelNameEntry"] = kernelNameEntry - # kernelNameEntry.grid(columnspan=2, row=1, column=1, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + kernelNameMenu.grid(row=1, column=1, sticky="nsew") generateDFGButton = tkinter.Button(kernelPannel, text = "Generate DFG", fg="black", command=clickShowDFG) - generateDFGButton.configure(width=10) - generateDFGButton.grid(columnspan=2, row=1, column=3, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + generateDFGButton.grid(row=1, column=2, sticky=tkinter.E) generateDFGShow = tkinter.Label(kernelPannel, text=" IDLE", fg='gray') - generateDFGShow.grid(row=1, column=4, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) + generateDFGShow.grid(row=1, column=3, sticky="ew") widgets["generateDFGShow"] = generateDFGShow dfgPannel = tkinter.LabelFrame(kernelPannel, text='Data-Flow Graph', fg="black", bd=BORDER, relief='groove') - dfgHeight = height-80-4*BORDER - dfgWidth = width-4*BORDER-120 - dfgPannel.place(height=dfgHeight, width=dfgWidth, x=BORDER, y=70+BORDER) - # dfgPannel.grid(columnspan=4, row=2, column=0, sticky=tkinter.W, padx=BORDER, pady=BORDER//2) - # PIL_image = Image.open("../CGRA-Mapper/test/kernel.png") - # PIL_image_small = PIL_image.resize((dfgWidth-10,dfgHeight-25), Image.Resampling.LANCZOS) - # dfgImage = ImageTk.PhotoImage(PIL_image_small) - # dfgImage = ImageTk.PhotoImage(PIL_image) - # images["dfgImage"] = dfgImage # This is important due to the garbage collection would remove local variable of image - dfgLabel = tkinter.Label(dfgPannel)# image=dfgImage) + dfgPannel.grid(row=2,column=0,rowspan=10,columnspan=2,sticky="nsew") + dfgLabel = tkinter.Label(dfgPannel) widgets["dfgLabel"] = dfgLabel dfgLabel.pack() recMIILabel = tkinter.Label(kernelPannel, text=" RecMII: ", fg='black') - recMIILabel.place(x=4*BORDER+dfgWidth, y=90+BORDER) - + recMIILabel.grid(row=2,column=2,sticky="nsew") recMIIEntry = tkinter.Entry(kernelPannel, fg="black", justify=tkinter.CENTER) widgets["recMIIEntry"] = recMIIEntry recMIIEntry.insert(0, "0") - recMIIEntry.configure(width=4) - recMIIEntry.place(x=4*BORDER+dfgWidth+60, y=90+BORDER) - + recMIIEntry.grid(row=2,column=3,sticky="ew") resMIILabel = tkinter.Label(kernelPannel, text=" ResMII: ", fg='black') - resMIILabel.place(x=4*BORDER+dfgWidth, y=120+BORDER) - + resMIILabel.grid(row=3,column=2,sticky="nsew") resMIIEntry = tkinter.Entry(kernelPannel, fg="black", justify=tkinter.CENTER) widgets["resMIIEntry"] = resMIIEntry resMIIEntry.insert(0, "0") - resMIIEntry.configure(width=4) - resMIIEntry.place(x=4*BORDER+dfgWidth+60, y=120+BORDER) + resMIIEntry.grid(row=3,column=3,sticky="ew") mappingOptionLabel = tkinter.Label(kernelPannel, text="Mapping algo:", fg='black') - mappingOptionLabel.place(x=4*BORDER+dfgWidth, y=155+BORDER) - + mappingOptionLabel.grid(row=4,column=2,columnspan=2,sticky="nsew") heuristicRatiobutton = tkinter.Radiobutton(kernelPannel, text="Heuristic", variable=mappingAlgoCheckVar, value=1) widgets["heuristicRatiobutton"] = heuristicRatiobutton - heuristicRatiobutton.place(x=2*BORDER+dfgWidth, y=180+BORDER) - + heuristicRatiobutton.grid(row=5,column=2,columnspan=2,sticky="nsew") exhaustiveRatiobutton = tkinter.Radiobutton(kernelPannel, text="Exhaustive", variable=mappingAlgoCheckVar, value=0) widgets["exhaustiveRatiobutton"] = exhaustiveRatiobutton - exhaustiveRatiobutton.place(x=2*BORDER+dfgWidth, y=200+BORDER) + exhaustiveRatiobutton.grid(row=6,column=2,columnspan=2,sticky="nsew") mapDFGButton = tkinter.Button(kernelPannel, text="Map DFG", fg="black", command=clickMapDFG) - mapDFGButton.configure(width=9) - mapDFGButton.place(x=4*BORDER+dfgWidth, y=230+BORDER) - + mapDFGButton.grid(row=7,column=2,columnspan=2,sticky="new") terminateMapButton = tkinter.Button(kernelPannel, text="Terminate", fg="black", command=clickTerminateMapping) - terminateMapButton.configure(width=9) - terminateMapButton.place(x=4*BORDER+dfgWidth, y=265+BORDER) + terminateMapButton.grid(row=8,column=2,columnspan=2,sticky="new") mapSecLabel = tkinter.Label(kernelPannel, text="Time (s): ", fg='black') - mapSecLabel.place(x=4*BORDER+dfgWidth, y=305+BORDER) - + mapSecLabel.grid(row=9,column=2,sticky="nsew") mapTimeEntry = tkinter.Entry(kernelPannel, fg="black", justify=tkinter.CENTER) widgets["mapTimeEntry"] = mapTimeEntry mapTimeEntry.insert(0, "0") - mapTimeEntry.configure(width=4) - mapTimeEntry.place(x=4*BORDER+dfgWidth+60, y=305+BORDER) - + mapTimeEntry.grid(row=9,column=3,sticky="ew") mapIILabel = tkinter.Label(kernelPannel, text=" Map II: ", fg='black') - mapIILabel.place(x=4*BORDER+dfgWidth, y=332+BORDER) - + mapIILabel.grid(row=10,column=2,sticky="nsew") mapIIEntry = tkinter.Entry(kernelPannel, fg="black", justify=tkinter.CENTER) widgets["mapIIEntry"] = mapIIEntry mapIIEntry.insert(0, "0") - mapIIEntry.configure(width=4) - mapIIEntry.place(x=4*BORDER+dfgWidth+60, y=332+BORDER) + mapIIEntry.grid(row=10,column=3,sticky="ew") speedupLabel = tkinter.Label(kernelPannel, text="Speedup: ", fg='black') - speedupLabel.place(x=3*BORDER+dfgWidth, y=360+BORDER) + speedupLabel.grid(row=11,column=2,sticky="nsew") CreateToolTip(speedupLabel, text = "The speedup is the improvement of\nthe execution cycles with respect to\na single-issue in-order CPU.") - mapSpeedupEntry = tkinter.Entry(kernelPannel, fg="black", justify=tkinter.CENTER) widgets["mapSpeedupEntry"] = mapSpeedupEntry mapSpeedupEntry.insert(0, "0") - mapSpeedupEntry.configure(width=4) - mapSpeedupEntry.place(x=4*BORDER+dfgWidth+60, y=360+BORDER) - - -#映射部分需要修改宽度参数 -def create_mapping_pannel(root, x, y, width): - - # GRID_WIDTH = (TILE_SIZE+LINK_LENGTH) * COLS - linkLength - TILE_WIDTH = (GRID_WIDTH + LINK_LENGTH) / COLS - LINK_LENGTH - TILE_HEIGHT = (GRID_HEIGHT + LINK_LENGTH) / ROWS - LINK_LENGTH - - frame = tkinter.LabelFrame(root, text="Mapping", bd=BORDER, relief='groove', width=width, height=GRID_HEIGHT+20) - frame.place(x=x, y=y) - # frame.pack(expand=True, fill=tkinter.BOTH) #.grid(row=0,column=0) - - cgraWidth = GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + 20 - mappingCanvas = tkinter.Canvas(frame, height=GRID_HEIGHT+20, width=width, scrollregion=(0,0,cgraWidth, GRID_HEIGHT)) - widgets["mappingCanvas"] = mappingCanvas - - hbar=tkinter.Scrollbar(frame, orient=tkinter.HORIZONTAL, bd=BORDER/4, relief='groove') - hbar.pack(side=tkinter.BOTTOM, fill=tkinter.X, expand=0) - hbar.config(command=mappingCanvas.xview) - mappingCanvas.config(width=width, height=GRID_HEIGHT+20) - mappingCanvas.config(xscrollcommand=hbar.set) - mappingCanvas.pack(side=tkinter.LEFT, expand=True, fill=tkinter.BOTH) - -#涉及到GUI界面参数与自适应 -#需要进一步修改 -create_cgra_pannel(master, ROWS, COLS) - + mapSpeedupEntry.grid(row=11,column=3,sticky="ew") paramPadPosX = GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + INTERVAL * 3 paramPadWidth = 270 -create_param_pannel(master, paramPadPosX, paramPadWidth, GRID_HEIGHT) - scriptPadPosX = paramPadPosX + paramPadWidth + INTERVAL scriptPadWidth = 300 - -create_test_pannel(master, scriptPadPosX, scriptPadWidth, GRID_HEIGHT//4-30) - -create_verilog_pannel(master, scriptPadPosX, GRID_HEIGHT//4-10, scriptPadWidth, GRID_HEIGHT//2-10) - -create_report_pannel(master, scriptPadPosX, GRID_HEIGHT*3//4-10, scriptPadWidth) - layoutPadPosX = scriptPadPosX + scriptPadWidth + INTERVAL layoutPadWidth = 300 -create_layout_pannel(master, layoutPadPosX, layoutPadWidth, GRID_HEIGHT) - -totalWidth = layoutPadPosX + layoutPadWidth - -create_kernel_pannel(master, INTERVAL, GRID_HEIGHT+INTERVAL*2, paramPadPosX-20, GRID_HEIGHT+55) - -create_mapping_pannel(master, paramPadPosX, GRID_HEIGHT+INTERVAL*2, totalWidth-paramPadPosX-5) - -master.geometry(str(layoutPadPosX+layoutPadWidth+INTERVAL)+"x"+str(GRID_HEIGHT*2+INTERVAL*3+50)) - -master.mainloop() +layoutPadHeight = GRID_HEIGHT +master.geometry(str(2764)+"x"+str(1340)) +create_kernel_pannel(master) +create_mapping_pannel(master) +create_layout_pannel(master) +create_report_pannel(master) +create_test_pannel(master) +create_verilog_pannel(master) +create_cgra_pannel(master, ROWS, COLS) +create_param_pannel(master) +#print(master.winfo_width()) +#print(master.winfo_height()) +master.mainloop() \ No newline at end of file From 653a99f8fae8cd9f99c6f7b865be137bbfd63c80 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Fri, 26 Apr 2024 11:11:32 +0800 Subject: [PATCH 07/15] GUI v1.0 --- launchUI.py | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/launchUI.py b/launchUI.py index 8d1ce6f..a5035e6 100644 --- a/launchUI.py +++ b/launchUI.py @@ -26,9 +26,9 @@ #TILE_HEIGHT = 60 #TILE_WIDTH = 60 #LINK_LENGTH = 40 -TILE_HEIGHT = 120 -TILE_WIDTH = 120 -LINK_LENGTH = 80 +TILE_HEIGHT = 95 +TILE_WIDTH = 95 +LINK_LENGTH = 65 INTERVAL = 10 BORDER = 4 master = tkinter.Tk() @@ -91,12 +91,12 @@ images = {} entireTileCheckVar = tkinter.IntVar() mappingAlgoCheckVar = tkinter.IntVar() -kernelOptions = tkinter.StringVar() -kernelOptions.set("Not selected yet") fuCheckVars = {} fuCheckbuttons = {} xbarCheckVars = {} xbarCheckbuttons = {} +kernelOptions = tkinter.StringVar() +kernelOptions.set("Not selected yet") synthesisRunning = False class ParamTile: def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): @@ -335,6 +335,7 @@ def setOutLink(s, portType, link): def resetOutLink(s, portType, link): s.setOutLink(portType, link) + class ParamLink: def __init__(s, srcTile, dstTile, srcPort, dstPort): s.srcTile = srcTile @@ -366,10 +367,7 @@ def isFromMem(s): def getSrcXY(s, baseX=0, baseY=0): if type(s.srcTile) != ParamSPM: - posX, posY = s.srcTile.getPosXYOnPort(s.srcPort, baseX, baseY) - #posY += 330 - #posX += 30 - return posX, posY + return s.srcTile.getPosXYOnPort(s.srcPort, baseX, baseY) else: dstPosX, dstPosY = s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) spmPosX = s.srcTile.getPosX(baseX) @@ -377,16 +375,12 @@ def getSrcXY(s, baseX=0, baseY=0): def getDstXY(s, baseX=0, baseY=0): if type(s.dstTile) != ParamSPM: - posX, posY = s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) - #posY += 330 - #posX += 30 - return posX, posY + return s.dstTile.getPosXYOnPort(s.dstPort, baseX, baseY) else: srcPosX, srcPosY = s.srcTile.getPosXYOnPort(s.srcPort, baseX, baseY) spmPosX = s.dstTile.getPosX(baseX) return spmPosX, srcPosY - class ParamCGRA: def __init__(s, rows, columns, configMemSize=CONFIG_MEM_SIZE, dataMemSize=DATA_MEM_SIZE): s.rows = rows @@ -630,6 +624,7 @@ def updateLinks(s): link.srcTile.xbarDict[xbarPort2Type[link.srcPort]] = 0 + class ToolTip(object): def __init__(self, widget): @@ -673,10 +668,11 @@ def leave(event): paramCGRA = ParamCGRA(ROWS, COLS, CONFIG_MEM_SIZE, DATA_MEM_SIZE) + def clickTile(ID): widgets["fuConfigPannel"].config(text='Tile '+str(ID)+' functional units') widgets["xbarConfigPannel"].config(text='Tile '+str(ID)+' crossbar outgoing links') - widgets["xbarConfigPannel"].grid(columnspan=4, row=7, column=0,rowspan=2) + widgets["xbarConfigPannel"].grid(columnspan=5, row=5, column=0, padx=BORDER, pady=BORDER) widgets["entireTileCheckbutton"].config(text='Disable entire Tile '+str(ID), state="normal") widgets["spmConfigPannel"].grid_forget() paramCGRA.targetTileID = ID @@ -691,7 +687,6 @@ def clickTile(ID): xbarCheckbuttons[xbarType].configure(state="disabled" if disabled or xbarType2Port[xbarType] in paramCGRA.tiles[ID].neverUsedOutPorts else "normal") entireTileCheckVar.set(1 if paramCGRA.getTileOfID(ID).disabled else 0) - def clickSPM(): widgets["fuConfigPannel"].config(text='Tile '+str(paramCGRA.targetTileID)+' functional units') @@ -704,7 +699,7 @@ def clickSPM(): spmConfigPannel = widgets["spmConfigPannel"] spmConfigPannel.config(text='DataSPM outgoing links') - spmConfigPannel.grid(row=7,column=0,rowspan=2,columnspan=4) + spmConfigPannel.grid(columnspan=5, row=5, column=0, padx=BORDER, pady=BORDER) spmEnabledListbox = widgets["spmEnabledListbox"] spmDisabledListbox = widgets["spmDisabledListbox"] @@ -1178,7 +1173,7 @@ def clickShowDFG(): os.chdir("kernel") fileExist = os.path.exists("kernel.bc") global paramCGRA - + if not fileExist or not paramCGRA.compilationDone or paramCGRA.targetKernelName == None: os.chdir("..") tkinter.messagebox.showerror(title="DFG Generation", message="The compilation and kernel selection need to be done first.") @@ -1243,7 +1238,7 @@ def clickShowDFG(): PIL_image = Image.open("kernel.png") ImageFile.LOAD_TRUNCATED_IMAGES = True - PIL_image_small = PIL_image.resize((310, 295), Image.Resampling.LANCZOS) + PIL_image_small = PIL_image.resize((700, 600), Image.Resampling.LANCZOS) dfgImage = ImageTk.PhotoImage(PIL_image_small) images["dfgImage"] = dfgImage # This is important due to the garbage collection would remove local variable of image widgets["dfgLabel"].config(image=dfgImage) @@ -1430,6 +1425,7 @@ def clickMapDFG(): + def create_cgra_pannel(master, rows, columns): ROWS = rows @@ -1795,11 +1791,12 @@ def create_layout_pannel(master): def create_mapping_pannel(master): mappingPannel = tkinter.LabelFrame(master, text='Mapping', bd=BORDER, relief='groove') mappingPannel.grid(row=3, column=3, rowspan=3,columnspan=4, sticky="nsew") - canvas = tkinter.Canvas(mappingPannel, bd=0) - scrollbar = tkinter.Scrollbar(mappingPannel, orient="horizontal", command=canvas.xview) - scrollbar.pack(side="bottom", fill="x") - canvas.config(xscrollcommand=scrollbar.set) - canvas.pack(side="top", fill="both", expand=True) + mappingCanvas = tkinter.Canvas(mappingPannel, bd=0) + widgets["mappingCanvas"] = mappingCanvas + hbar = tkinter.Scrollbar(mappingPannel, orient="horizontal", command=mappingCanvas.xview) + hbar.pack(side="bottom", fill="x") + mappingCanvas.config(xscrollcommand=hbar.set) + mappingCanvas.pack(side="top", fill="both", expand=True) def create_kernel_pannel(master): kernelPannel = tkinter.LabelFrame(master, text="Kernel", bd=BORDER, relief='groove') @@ -1831,6 +1828,7 @@ def create_kernel_pannel(master): tempOptions = [ "Not selected yet" ] kernelNameMenu = tkinter.OptionMenu(kernelPannel, kernelOptions, *tempOptions) + kernelOptions.trace("w", clickKernelMenu) widgets["kernelNameMenu"] = kernelNameMenu kernelNameMenu.grid(row=1, column=1, sticky="nsew") @@ -1894,6 +1892,7 @@ def create_kernel_pannel(master): widgets["mapSpeedupEntry"] = mapSpeedupEntry mapSpeedupEntry.insert(0, "0") mapSpeedupEntry.grid(row=11,column=3,sticky="ew") + paramPadPosX = GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + INTERVAL * 3 paramPadWidth = 270 scriptPadPosX = paramPadPosX + paramPadWidth + INTERVAL From d869915b206c4a58363da492962f124829145b12 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Sat, 27 Apr 2024 21:08:23 +0800 Subject: [PATCH 08/15] GUI v2.0 --- launchUI.py | 56 +++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/launchUI.py b/launchUI.py index a5035e6..f5391ca 100644 --- a/launchUI.py +++ b/launchUI.py @@ -41,7 +41,7 @@ master.grid_rowconfigure(5, weight=2) master.grid_columnconfigure(0, weight=2) master.grid_columnconfigure(1, weight=2) -master.grid_columnconfigure(2, weight=1) +master.grid_columnconfigure(2, weight=2) master.grid_columnconfigure(3, weight=1) master.grid_columnconfigure(4, weight=2) master.grid_columnconfigure(5, weight=2) @@ -672,7 +672,7 @@ def leave(event): def clickTile(ID): widgets["fuConfigPannel"].config(text='Tile '+str(ID)+' functional units') widgets["xbarConfigPannel"].config(text='Tile '+str(ID)+' crossbar outgoing links') - widgets["xbarConfigPannel"].grid(columnspan=5, row=5, column=0, padx=BORDER, pady=BORDER) + widgets["xbarConfigPannel"].grid(columnspan=4, row=7, column=0,rowspan=2) widgets["entireTileCheckbutton"].config(text='Disable entire Tile '+str(ID), state="normal") widgets["spmConfigPannel"].grid_forget() paramCGRA.targetTileID = ID @@ -699,7 +699,7 @@ def clickSPM(): spmConfigPannel = widgets["spmConfigPannel"] spmConfigPannel.config(text='DataSPM outgoing links') - spmConfigPannel.grid(columnspan=5, row=5, column=0, padx=BORDER, pady=BORDER) + spmConfigPannel.grid(row=7,column=0,rowspan=2,columnspan=4) spmEnabledListbox = widgets["spmEnabledListbox"] spmDisabledListbox = widgets["spmDisabledListbox"] @@ -1238,7 +1238,7 @@ def clickShowDFG(): PIL_image = Image.open("kernel.png") ImageFile.LOAD_TRUNCATED_IMAGES = True - PIL_image_small = PIL_image.resize((700, 600), Image.Resampling.LANCZOS) + PIL_image_small = PIL_image.resize((400, 400), Image.Resampling.LANCZOS) dfgImage = ImageTk.PhotoImage(PIL_image_small) images["dfgImage"] = dfgImage # This is important due to the garbage collection would remove local variable of image widgets["dfgLabel"].config(image=dfgImage) @@ -1433,16 +1433,18 @@ def create_cgra_pannel(master, rows, columns): TILE_WIDTH = (GRID_WIDTH + LINK_LENGTH) / COLS - LINK_LENGTH TILE_HEIGHT = (GRID_HEIGHT + LINK_LENGTH) / ROWS - LINK_LENGTH totalWidth = GRID_WIDTH+MEM_WIDTH+LINK_LENGTH - canvas = tkinter.Canvas(master) - canvas.grid(row=0,column=0,rowspan=3,columnspan=2,sticky="nsew") - #vertical_scrollbar = tkinter.Scrollbar(master,orient="vertical",command=canvas.yview) - #vertical_scrollbar.grid(row=0, column=1, sticky="ns") - #canvas.configure(yscrollcommand=vertical_scrollbar.set) - - #horizontal_scrollbar = tkinter.Scrollbar(master, orient="horizontal", command=canvas.xview) - #horizontal_scrollbar.grid(row=1, column=0, sticky="ew") - #canvas.configure(xscrollcommand=horizontal_scrollbar.set) - #canvas.config(scrollregion=canvas.bbox("all")) + cgraPannel = tkinter.LabelFrame(master, text='CGRA', bd=BORDER, relief='groove') + cgraPannel.grid(row=0, column=0, rowspan=3,columnspan=2, sticky="nsew") + canvas = tkinter.Canvas(cgraPannel) + #canvas = tkinter.Canvas(master) + #canvas.grid(row=0,column=0,rowspan=3,columnspan=2,sticky="nsew") + hbar = tkinter.Scrollbar(cgraPannel, orient="horizontal", command=canvas.xview) + hbar.pack(side="bottom", fill="x") + canvas.config(xscrollcommand=hbar.set) + vbar = tkinter.Scrollbar(cgraPannel,orient="vertical",command=canvas.yview) + vbar.pack(side=tkinter.RIGHT,fill="y") + canvas.config(yscrollcommand=vbar.set) + canvas.pack(side="top", fill="both", expand=True) # pad contains tile and links # padSize = TILE_SIZE + LINK_LENGTH @@ -1724,7 +1726,7 @@ def create_verilog_pannel(master): def create_report_pannel(master): reportPannel = tkinter.LabelFrame(master, text='Report area/power', bd = BORDER, relief='groove') reportPannel.grid(row=2,column=3,rowspan=1,columnspan=1,sticky='nw') - reportPannel.grid_configure(rows=3, columns=4) + reportPannel.grid_configure(rows=6, columns=2) reportButton = tkinter.Button(reportPannel, text="Synthesize", relief="raised", command=clickSynthesize) reportProgress = ttk.Progressbar(reportPannel, orient="horizontal", mode="determinate") @@ -1759,18 +1761,18 @@ def create_report_pannel(master): widgets["reportSPMPowerData"] = reportSPMPowerData reportButton.grid(row=0, column=0) - reportProgress.grid(row=0,column=1,columnspan=2) - synthesisTimeEntry.grid(row=0, column=3) + reportProgress.grid(row=1,column=1) + synthesisTimeEntry.grid(row=0, column=1) - reportTileAreaLabel.grid(row=1, column=0) - reportTileAreaData.grid(row=1, column=1) - reportTilePowerLabel.grid(row=1, column=2) - reportTilePowerData.grid(row=1, column=3) + reportTileAreaLabel.grid(row=2, column=0) + reportTileAreaData.grid(row=2, column=1) + reportTilePowerLabel.grid(row=3, column=0) + reportTilePowerData.grid(row=3, column=1) - reportSPMAreaLabel.grid(row=2, column=0) - reportSPMAreaData.grid(row=2, column=1) - reportSPMPowerLabel.grid(row=2, column=2) - reportSPMPowerData.grid(row=2, column=3) + reportSPMAreaLabel.grid(row=4, column=0) + reportSPMAreaData.grid(row=4, column=1) + reportSPMPowerLabel.grid(row=5, column=0) + reportSPMPowerData.grid(row=5, column=1) def create_layout_pannel(master): layoutPannel = tkinter.LabelFrame(master, text='Layout', bd=BORDER, relief='groove') @@ -1817,7 +1819,7 @@ def create_kernel_pannel(master): appPathEntry.bind("", clickSelectApp) compileAppButton = tkinter.Button(kernelPannel, text=" Compile app ", fg="black", command=clickCompileApp) - compileAppButton.grid(row=0, column=2,sticky=tkinter.E) + compileAppButton.grid(row=0, column=2,sticky="nsew") compileAppShow = tkinter.Label(kernelPannel, text=" IDLE", fg='gray') compileAppShow.grid(row=0, column=3, sticky="ew") @@ -1833,7 +1835,7 @@ def create_kernel_pannel(master): kernelNameMenu.grid(row=1, column=1, sticky="nsew") generateDFGButton = tkinter.Button(kernelPannel, text = "Generate DFG", fg="black", command=clickShowDFG) - generateDFGButton.grid(row=1, column=2, sticky=tkinter.E) + generateDFGButton.grid(row=1, column=2, sticky="nsew") generateDFGShow = tkinter.Label(kernelPannel, text=" IDLE", fg='gray') generateDFGShow.grid(row=1, column=3, sticky="ew") From 4d70c523c0e7d91031f0d7f7a1f02cf891577c7f Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Sat, 27 Apr 2024 21:22:03 +0800 Subject: [PATCH 09/15] GUI v3.0 --- launchUI.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/launchUI.py b/launchUI.py index f5391ca..e0c8f77 100644 --- a/launchUI.py +++ b/launchUI.py @@ -1725,8 +1725,8 @@ def create_verilog_pannel(master): def create_report_pannel(master): reportPannel = tkinter.LabelFrame(master, text='Report area/power', bd = BORDER, relief='groove') - reportPannel.grid(row=2,column=3,rowspan=1,columnspan=1,sticky='nw') - reportPannel.grid_configure(rows=6, columns=2) + reportPannel.grid(row=2,column=3,rowspan=1,columnspan=1,sticky='nesw') + #reportPannel.grid_configure(rows=6, columns=2) reportButton = tkinter.Button(reportPannel, text="Synthesize", relief="raised", command=clickSynthesize) reportProgress = ttk.Progressbar(reportPannel, orient="horizontal", mode="determinate") @@ -1760,19 +1760,19 @@ def create_report_pannel(master): reportSPMPowerData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportSPMPowerData"] = reportSPMPowerData - reportButton.grid(row=0, column=0) - reportProgress.grid(row=1,column=1) - synthesisTimeEntry.grid(row=0, column=1) + reportButton.grid(row=0, column=0,pady=10,padx=10) + reportProgress.grid(row=1,column=1,pady=10) + synthesisTimeEntry.grid(row=0, column=1,pady=10) - reportTileAreaLabel.grid(row=2, column=0) - reportTileAreaData.grid(row=2, column=1) - reportTilePowerLabel.grid(row=3, column=0) - reportTilePowerData.grid(row=3, column=1) + reportTileAreaLabel.grid(row=2, column=0,pady=5) + reportTileAreaData.grid(row=2, column=1,pady=5) + reportTilePowerLabel.grid(row=3, column=0,pady=5) + reportTilePowerData.grid(row=3, column=1,pady=5) - reportSPMAreaLabel.grid(row=4, column=0) - reportSPMAreaData.grid(row=4, column=1) - reportSPMPowerLabel.grid(row=5, column=0) - reportSPMPowerData.grid(row=5, column=1) + reportSPMAreaLabel.grid(row=4, column=0,pady=5) + reportSPMAreaData.grid(row=4, column=1,pady=5) + reportSPMPowerLabel.grid(row=5, column=0,pady=5) + reportSPMPowerData.grid(row=5, column=1,pady=5) def create_layout_pannel(master): layoutPannel = tkinter.LabelFrame(master, text='Layout', bd=BORDER, relief='groove') @@ -1906,9 +1906,9 @@ def create_kernel_pannel(master): create_kernel_pannel(master) create_mapping_pannel(master) create_layout_pannel(master) -create_report_pannel(master) create_test_pannel(master) create_verilog_pannel(master) +create_report_pannel(master) create_cgra_pannel(master, ROWS, COLS) create_param_pannel(master) #print(master.winfo_width()) From 1aff27c1473aed2938bf936103ffe1efa9e7d348 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Sat, 27 Apr 2024 21:24:09 +0800 Subject: [PATCH 10/15] Made certain modifications to the file to adapt to the local environment. --- run_docker.sh | 1 + script1.py | 1 + 2 files changed, 2 insertions(+) diff --git a/run_docker.sh b/run_docker.sh index 7b52d54..0d3a47d 100755 --- a/run_docker.sh +++ b/run_docker.sh @@ -15,6 +15,7 @@ socat TCP-LISTEN:${PORT_NUM},reuseaddr,fork UNIX-CLIENT:/tmp/.X11-unix/X0 > /de XSOCK=/tmp/.X11-unix + sudo docker run \ -it \ --name=CGRA-Flow-v2 \ diff --git a/script1.py b/script1.py index 3587d6e..a7c6b84 100755 --- a/script1.py +++ b/script1.py @@ -6,6 +6,7 @@ #!/usr/bin/python3 sudo docker exec -it CGRA-Flow-v2 /bin/bash + #source /WORK_REPO/venv/bin/activate #cd CGRA-Flow #python launchUI.py From 49143b05cb05a0d435a7c22ac8cd54dc270a58c0 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Sun, 28 Apr 2024 20:33:50 +0800 Subject: [PATCH 11/15] GUI v4.0 --- launchUI.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/launchUI.py b/launchUI.py index e0c8f77..b060844 100644 --- a/launchUI.py +++ b/launchUI.py @@ -45,6 +45,7 @@ master.grid_columnconfigure(3, weight=1) master.grid_columnconfigure(4, weight=2) master.grid_columnconfigure(5, weight=2) + ROWS = 4 COLS = 4 GRID_WIDTH = (TILE_WIDTH+LINK_LENGTH) * COLS - LINK_LENGTH @@ -1433,11 +1434,10 @@ def create_cgra_pannel(master, rows, columns): TILE_WIDTH = (GRID_WIDTH + LINK_LENGTH) / COLS - LINK_LENGTH TILE_HEIGHT = (GRID_HEIGHT + LINK_LENGTH) / ROWS - LINK_LENGTH totalWidth = GRID_WIDTH+MEM_WIDTH+LINK_LENGTH - cgraPannel = tkinter.LabelFrame(master, text='CGRA', bd=BORDER, relief='groove') + cgraPannel = tkinter.Frame(master, bd=BORDER, relief='groove') cgraPannel.grid(row=0, column=0, rowspan=3,columnspan=2, sticky="nsew") canvas = tkinter.Canvas(cgraPannel) - #canvas = tkinter.Canvas(master) - #canvas.grid(row=0,column=0,rowspan=3,columnspan=2,sticky="nsew") + canvas.config(scrollregion=(0, 0, 700, 580)) hbar = tkinter.Scrollbar(cgraPannel, orient="horizontal", command=canvas.xview) hbar.pack(side="bottom", fill="x") canvas.config(xscrollcommand=hbar.set) @@ -1445,7 +1445,6 @@ def create_cgra_pannel(master, rows, columns): vbar.pack(side=tkinter.RIGHT,fill="y") canvas.config(yscrollcommand=vbar.set) canvas.pack(side="top", fill="both", expand=True) - # pad contains tile and links # padSize = TILE_SIZE + LINK_LENGTH padHeight = TILE_HEIGHT + LINK_LENGTH @@ -1475,12 +1474,16 @@ def create_cgra_pannel(master, rows, columns): # draw tiles for tile in paramCGRA.tiles: - if not tile.disabled: - button = tkinter.Button(canvas, text = "Tile "+str(tile.ID), fg='black', bg='gray', relief='raised', bd=BORDER, command=partial(clickTile, tile.ID)) - + if not tile.disabled: posX, posY = tile.getPosXY() - button.place(height=TILE_HEIGHT, width=TILE_WIDTH, x = posX, y = posY) - + button_width = TILE_WIDTH + button_height = TILE_HEIGHT + button = canvas.create_rectangle(posX, posY, posX + button_width, posY + button_height, fill='gray') + tile_id_text = "Tile " + str(tile.ID) + text_x = posX + button_width // 2 + text_y = posY + button_height // 2 + canvas.create_text(text_x, text_y, text=tile_id_text) # Add text inside the rectangle + canvas.tag_bind(button, '', partial(clickTile, tile.ID)) # construct links if len(paramCGRA.templateLinks) == 0: @@ -1541,9 +1544,14 @@ def create_cgra_pannel(master, rows, columns): else: srcX, srcY = link.getSrcXY() dstX, dstY = link.getDstXY() + srcX = canvas.canvasx(srcX) + srcY = canvas.canvasy(srcY) + dstX = canvas.canvasx(dstX) + dstY = canvas.canvasy(dstY) canvas.create_line(srcX, srcY, dstX, dstY, arrow=tkinter.LAST) + def place_fu_options(master): fuCount = len(fuTypeList) for i in range(len(fuTypeList)): @@ -1798,6 +1806,9 @@ def create_mapping_pannel(master): hbar = tkinter.Scrollbar(mappingPannel, orient="horizontal", command=mappingCanvas.xview) hbar.pack(side="bottom", fill="x") mappingCanvas.config(xscrollcommand=hbar.set) + vbar = tkinter.Scrollbar(mappingPannel,orient="vertical",command=mappingCanvas.yview) + vbar.pack(side=tkinter.RIGHT,fill="y") + mappingCanvas.config(yscrollcommand=vbar.set) mappingCanvas.pack(side="top", fill="both", expand=True) def create_kernel_pannel(master): From 5b63b9ad6d98ba61216ef8a24f5937646067dd20 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Mon, 29 Apr 2024 14:31:54 +0800 Subject: [PATCH 12/15] GUI v5.0 --- launchUI.py | 46 +++++++++++++++++++--------------------------- run_docker.sh | 16 ++++++---------- script1.py | 12 ------------ 3 files changed, 25 insertions(+), 49 deletions(-) delete mode 100755 script1.py diff --git a/launchUI.py b/launchUI.py index b060844..51c5294 100644 --- a/launchUI.py +++ b/launchUI.py @@ -26,9 +26,9 @@ #TILE_HEIGHT = 60 #TILE_WIDTH = 60 #LINK_LENGTH = 40 -TILE_HEIGHT = 95 -TILE_WIDTH = 95 -LINK_LENGTH = 65 +TILE_HEIGHT = 75 +TILE_WIDTH = 75 +LINK_LENGTH = 50 INTERVAL = 10 BORDER = 4 master = tkinter.Tk() @@ -36,16 +36,15 @@ master.grid_rowconfigure(0, weight=1) master.grid_rowconfigure(1, weight=1) master.grid_rowconfigure(2, weight=1) -master.grid_rowconfigure(3, weight=2) -master.grid_rowconfigure(4, weight=2) -master.grid_rowconfigure(5, weight=2) +master.grid_rowconfigure(3, weight=1) +master.grid_rowconfigure(4, weight=1) +master.grid_rowconfigure(5, weight=1) master.grid_columnconfigure(0, weight=2) master.grid_columnconfigure(1, weight=2) -master.grid_columnconfigure(2, weight=2) -master.grid_columnconfigure(3, weight=1) +#master.grid_columnconfigure(2, weight=1) +#master.grid_columnconfigure(3, weight=1) master.grid_columnconfigure(4, weight=2) master.grid_columnconfigure(5, weight=2) - ROWS = 4 COLS = 4 GRID_WIDTH = (TILE_WIDTH+LINK_LENGTH) * COLS - LINK_LENGTH @@ -1239,7 +1238,7 @@ def clickShowDFG(): PIL_image = Image.open("kernel.png") ImageFile.LOAD_TRUNCATED_IMAGES = True - PIL_image_small = PIL_image.resize((400, 400), Image.Resampling.LANCZOS) + PIL_image_small = PIL_image.resize((390, 390), Image.Resampling.LANCZOS) dfgImage = ImageTk.PhotoImage(PIL_image_small) images["dfgImage"] = dfgImage # This is important due to the garbage collection would remove local variable of image widgets["dfgLabel"].config(image=dfgImage) @@ -1434,10 +1433,11 @@ def create_cgra_pannel(master, rows, columns): TILE_WIDTH = (GRID_WIDTH + LINK_LENGTH) / COLS - LINK_LENGTH TILE_HEIGHT = (GRID_HEIGHT + LINK_LENGTH) / ROWS - LINK_LENGTH totalWidth = GRID_WIDTH+MEM_WIDTH+LINK_LENGTH - cgraPannel = tkinter.Frame(master, bd=BORDER, relief='groove') + cgraPannel = tkinter.LabelFrame(master, text='CGRA', bd=BORDER, relief='groove') cgraPannel.grid(row=0, column=0, rowspan=3,columnspan=2, sticky="nsew") canvas = tkinter.Canvas(cgraPannel) - canvas.config(scrollregion=(0, 0, 700, 580)) + #canvas = tkinter.Canvas(master) + #canvas.grid(row=0,column=0,rowspan=3,columnspan=2,sticky="nsew") hbar = tkinter.Scrollbar(cgraPannel, orient="horizontal", command=canvas.xview) hbar.pack(side="bottom", fill="x") canvas.config(xscrollcommand=hbar.set) @@ -1445,6 +1445,7 @@ def create_cgra_pannel(master, rows, columns): vbar.pack(side=tkinter.RIGHT,fill="y") canvas.config(yscrollcommand=vbar.set) canvas.pack(side="top", fill="both", expand=True) + # pad contains tile and links # padSize = TILE_SIZE + LINK_LENGTH padHeight = TILE_HEIGHT + LINK_LENGTH @@ -1474,16 +1475,12 @@ def create_cgra_pannel(master, rows, columns): # draw tiles for tile in paramCGRA.tiles: - if not tile.disabled: + if not tile.disabled: + button = tkinter.Button(canvas, text = "Tile "+str(tile.ID), fg='black', bg='gray', relief='raised', bd=BORDER, command=partial(clickTile, tile.ID)) + posX, posY = tile.getPosXY() - button_width = TILE_WIDTH - button_height = TILE_HEIGHT - button = canvas.create_rectangle(posX, posY, posX + button_width, posY + button_height, fill='gray') - tile_id_text = "Tile " + str(tile.ID) - text_x = posX + button_width // 2 - text_y = posY + button_height // 2 - canvas.create_text(text_x, text_y, text=tile_id_text) # Add text inside the rectangle - canvas.tag_bind(button, '', partial(clickTile, tile.ID)) + button.place(height=TILE_HEIGHT, width=TILE_WIDTH, x = posX, y = posY) + # construct links if len(paramCGRA.templateLinks) == 0: @@ -1544,14 +1541,9 @@ def create_cgra_pannel(master, rows, columns): else: srcX, srcY = link.getSrcXY() dstX, dstY = link.getDstXY() - srcX = canvas.canvasx(srcX) - srcY = canvas.canvasy(srcY) - dstX = canvas.canvasx(dstX) - dstY = canvas.canvasy(dstY) canvas.create_line(srcX, srcY, dstX, dstY, arrow=tkinter.LAST) - def place_fu_options(master): fuCount = len(fuTypeList) for i in range(len(fuTypeList)): @@ -1913,7 +1905,7 @@ def create_kernel_pannel(master): layoutPadPosX = scriptPadPosX + scriptPadWidth + INTERVAL layoutPadWidth = 300 layoutPadHeight = GRID_HEIGHT -master.geometry(str(2764)+"x"+str(1340)) +master.geometry(str(1950)+"x"+str(1100)) create_kernel_pannel(master) create_mapping_pannel(master) create_layout_pannel(master) diff --git a/run_docker.sh b/run_docker.sh index 0d3a47d..fc721c4 100755 --- a/run_docker.sh +++ b/run_docker.sh @@ -1,28 +1,24 @@ #!/usr/bin/env bash IMAGE=cgra/cgra-flow:demo -#COMMAND=/bin/bash +COMMAND=/bin/bash NIC=$(sudo cat /proc/net/dev | awk 'END {print $1}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g') # Grab the ip address of this box -IPADDR=$(ifconfig "$NIC" | grep "inet " | awk '{print $2}') +IPADDR=$(ifconfig $NIC | grep "inet " | awk '{print $2}') -DISP_NUM=12 # fixed display number to 100 +DISP_NUM=100 # fixed display number to 100 PORT_NUM=$((6000 + DISP_NUM)) -socat TCP-LISTEN:${PORT_NUM},reuseaddr,fork UNIX-CLIENT:/tmp/.X11-unix/X0 > /dev/null 2>&1 & +socat TCP-LISTEN:${PORT_NUM},reuseaddr,fork UNIX-CLIENT:/tmp/.X11-unix/X0 2>&1 > /dev/null & XSOCK=/tmp/.X11-unix - sudo docker run \ -it \ - --name=CGRA-Flow-v2 \ + --name=CGRA-Flow \ -v $XSOCK:$XSOCK:rw \ - -v /etc/localtime:/etc/localtime:ro \ - -e DISPLAY="$IPADDR":$DISP_NUM \ - -e GDK_SCALE \ - -e GDIK_DPI_SCALE \ + -e DISPLAY=$IPADDR:$DISP_NUM \ $IMAGE diff --git a/script1.py b/script1.py deleted file mode 100755 index a7c6b84..0000000 --- a/script1.py +++ /dev/null @@ -1,12 +0,0 @@ -# This is my first python script. -# It is written to open the environment quickly. -# I hope it is a good example. -# Come on,sir. - -#!/usr/bin/python3 -sudo docker exec -it CGRA-Flow-v2 /bin/bash - - -#source /WORK_REPO/venv/bin/activate -#cd CGRA-Flow -#python launchUI.py From b93aacbee47d97aeda30f62044d5e9341eb04be6 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Mon, 29 Apr 2024 15:36:01 +0800 Subject: [PATCH 13/15] GUI v6.0 --- launchUI.py | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/launchUI.py b/launchUI.py index 51c5294..ba90deb 100644 --- a/launchUI.py +++ b/launchUI.py @@ -1424,10 +1424,7 @@ def clickMapDFG(): timer.start() - - def create_cgra_pannel(master, rows, columns): - ROWS = rows COLS = columns TILE_WIDTH = (GRID_WIDTH + LINK_LENGTH) / COLS - LINK_LENGTH @@ -1438,13 +1435,10 @@ def create_cgra_pannel(master, rows, columns): canvas = tkinter.Canvas(cgraPannel) #canvas = tkinter.Canvas(master) #canvas.grid(row=0,column=0,rowspan=3,columnspan=2,sticky="nsew") + canvas.pack(side="top", fill="both", expand=True) hbar = tkinter.Scrollbar(cgraPannel, orient="horizontal", command=canvas.xview) hbar.pack(side="bottom", fill="x") canvas.config(xscrollcommand=hbar.set) - vbar = tkinter.Scrollbar(cgraPannel,orient="vertical",command=canvas.yview) - vbar.pack(side=tkinter.RIGHT,fill="y") - canvas.config(yscrollcommand=vbar.set) - canvas.pack(side="top", fill="both", expand=True) # pad contains tile and links # padSize = TILE_SIZE + LINK_LENGTH @@ -1477,7 +1471,6 @@ def create_cgra_pannel(master, rows, columns): for tile in paramCGRA.tiles: if not tile.disabled: button = tkinter.Button(canvas, text = "Tile "+str(tile.ID), fg='black', bg='gray', relief='raised', bd=BORDER, command=partial(clickTile, tile.ID)) - posX, posY = tile.getPosXY() button.place(height=TILE_HEIGHT, width=TILE_WIDTH, x = posX, y = posY) @@ -1898,14 +1891,14 @@ def create_kernel_pannel(master): mapSpeedupEntry.insert(0, "0") mapSpeedupEntry.grid(row=11,column=3,sticky="ew") -paramPadPosX = GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + INTERVAL * 3 -paramPadWidth = 270 -scriptPadPosX = paramPadPosX + paramPadWidth + INTERVAL -scriptPadWidth = 300 -layoutPadPosX = scriptPadPosX + scriptPadWidth + INTERVAL -layoutPadWidth = 300 -layoutPadHeight = GRID_HEIGHT -master.geometry(str(1950)+"x"+str(1100)) +#paramPadPosX = GRID_WIDTH + MEM_WIDTH + LINK_LENGTH + INTERVAL * 3 +#paramPadWidth = 270 +#scriptPadPosX = paramPadPosX + paramPadWidth + INTERVAL +#scriptPadWidth = 300 +#layoutPadPosX = scriptPadPosX + scriptPadWidth + INTERVAL +#layoutPadWidth = 300 +#layoutPadHeight = GRID_HEIGHT +master.geometry(str(1900)+"x"+str(1100)) create_kernel_pannel(master) create_mapping_pannel(master) create_layout_pannel(master) From 4b824eb10ecd05c7023b617fa696b96f3246c238 Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Mon, 6 May 2024 16:36:35 +0800 Subject: [PATCH 14/15] GUI v7.0 --- launchUI.py | 143 ++++++++++++++++++++++++++-------------------------- 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/launchUI.py b/launchUI.py index ba90deb..c743acd 100644 --- a/launchUI.py +++ b/launchUI.py @@ -26,25 +26,11 @@ #TILE_HEIGHT = 60 #TILE_WIDTH = 60 #LINK_LENGTH = 40 -TILE_HEIGHT = 75 -TILE_WIDTH = 75 -LINK_LENGTH = 50 +TILE_HEIGHT = 65 +TILE_WIDTH = 60 +LINK_LENGTH = 40 INTERVAL = 10 BORDER = 4 -master = tkinter.Tk() -master.title("CGRA-Flow: An Integrated End-to-End Framework for CGRA Exploration, Compilation, and Development") -master.grid_rowconfigure(0, weight=1) -master.grid_rowconfigure(1, weight=1) -master.grid_rowconfigure(2, weight=1) -master.grid_rowconfigure(3, weight=1) -master.grid_rowconfigure(4, weight=1) -master.grid_rowconfigure(5, weight=1) -master.grid_columnconfigure(0, weight=2) -master.grid_columnconfigure(1, weight=2) -#master.grid_columnconfigure(2, weight=1) -#master.grid_columnconfigure(3, weight=1) -master.grid_columnconfigure(4, weight=2) -master.grid_columnconfigure(5, weight=2) ROWS = 4 COLS = 4 GRID_WIDTH = (TILE_WIDTH+LINK_LENGTH) * COLS - LINK_LENGTH @@ -52,7 +38,19 @@ MEM_WIDTH = 50 CONFIG_MEM_SIZE = 8 DATA_MEM_SIZE = 4 - +def window_size(window, width, height): + window.geometry(f"{width}x{height}") +master = tkinter.Tk() +master.title("CGRA-Flow: An Integrated End-to-End Framework for CGRA Exploration, Compilation, and Development") +default_width = 1700 +default_height = 920 +window_size(master, default_width, default_height) +master.grid_rowconfigure(0, weight=2) +master.grid_rowconfigure(1, weight=3) +master.grid_columnconfigure(0, weight=1) +master.grid_columnconfigure(1, weight=1) +master.grid_columnconfigure(2, weight=1) +master.grid_columnconfigure(3, weight=1) fuTypeList = ["Phi", "Add", "Shift", "Ld", "Sel", "Cmp", "MAC", "St", "Ret", "Mul", "Logic", "Br"] xbarTypeList = ["W", "E", "N", "S", "NE", "NW", "SE", "SW"] @@ -98,6 +96,7 @@ kernelOptions = tkinter.StringVar() kernelOptions.set("Not selected yet") synthesisRunning = False + class ParamTile: def __init__(s, ID, dimX, dimY, posX, posY, tileWidth, tileHeight): s.ID = ID @@ -264,8 +263,6 @@ def getIndex(s, tileList): elif tile.dimY == s.dimY and tile.dimX < s.dimX and not tile.disabled: index += 1 return index - - class ParamSPM: def __init__(s, posX, numOfReadPorts, numOfWritePorts): s.posX = posX @@ -1238,7 +1235,7 @@ def clickShowDFG(): PIL_image = Image.open("kernel.png") ImageFile.LOAD_TRUNCATED_IMAGES = True - PIL_image_small = PIL_image.resize((390, 390), Image.Resampling.LANCZOS) + PIL_image_small = PIL_image.resize((205, 310), Image.Resampling.LANCZOS) dfgImage = ImageTk.PhotoImage(PIL_image_small) images["dfgImage"] = dfgImage # This is important due to the garbage collection would remove local variable of image widgets["dfgLabel"].config(image=dfgImage) @@ -1431,7 +1428,7 @@ def create_cgra_pannel(master, rows, columns): TILE_HEIGHT = (GRID_HEIGHT + LINK_LENGTH) / ROWS - LINK_LENGTH totalWidth = GRID_WIDTH+MEM_WIDTH+LINK_LENGTH cgraPannel = tkinter.LabelFrame(master, text='CGRA', bd=BORDER, relief='groove') - cgraPannel.grid(row=0, column=0, rowspan=3,columnspan=2, sticky="nsew") + cgraPannel.grid(row=0, column=0, rowspan=1,columnspan=1, sticky="nsew") canvas = tkinter.Canvas(cgraPannel) #canvas = tkinter.Canvas(master) #canvas.grid(row=0,column=0,rowspan=3,columnspan=2,sticky="nsew") @@ -1453,7 +1450,7 @@ def create_cgra_pannel(master, rows, columns): # draw data memory memHeight = GRID_HEIGHT button = tkinter.Button(canvas, text = "Data\nSPM", fg = 'black', bg = 'gray', relief = 'raised', bd = BORDER, command = clickSPM) - button.place(height=memHeight, width=MEM_WIDTH, x = 0, y = 0) + button.place(height=memHeight, width=MEM_WIDTH, x = 0, y = 25) # construct tiles @@ -1472,7 +1469,7 @@ def create_cgra_pannel(master, rows, columns): if not tile.disabled: button = tkinter.Button(canvas, text = "Tile "+str(tile.ID), fg='black', bg='gray', relief='raised', bd=BORDER, command=partial(clickTile, tile.ID)) posX, posY = tile.getPosXY() - button.place(height=TILE_HEIGHT, width=TILE_WIDTH, x = posX, y = posY) + button.place(height=TILE_HEIGHT, width=TILE_WIDTH, x = posX, y = posY + 25) # construct links @@ -1534,7 +1531,7 @@ def create_cgra_pannel(master, rows, columns): else: srcX, srcY = link.getSrcXY() dstX, dstY = link.getDstXY() - canvas.create_line(srcX, srcY, dstX, dstY, arrow=tkinter.LAST) + canvas.create_line(srcX, srcY + 25, dstX, dstY + 25, arrow=tkinter.LAST) def place_fu_options(master): @@ -1546,7 +1543,7 @@ def place_fu_options(master): fuCheckbuttons[fuTypeList[i]] = fuCheckbutton fuCheckbutton.select() paramCGRA.updateFuCheckbutton(fuTypeList[i], fuVar.get()) - fuCheckbutton.grid(row=i//4, column=i%4, padx=30, pady=30, sticky="nsew") + fuCheckbutton.grid(row=i//4, column=i%4, padx=15, pady=15, sticky="nsew") def place_xbar_options(master): for i in range(PORT_DIRECTION_COUNTS): @@ -1565,13 +1562,13 @@ def place_xbar_options(master): if portType in paramCGRA.getTileOfID(0).neverUsedOutPorts: xbarCheckbutton.configure(state="disabled") - xbarCheckbutton.grid(row=i//4, column=i%4, padx=30, pady=30, sticky="nsew") + xbarCheckbutton.grid(row=i//4, column=i%4, padx=15, pady=15, sticky="nsew") def create_param_pannel(master): paramPannel = tkinter.LabelFrame(master, text='Configuration', bd=BORDER, relief='groove') - paramPannel.grid(row=0,column=2,rowspan=3,columnspan=1,sticky="nsew") + paramPannel.grid(row=0,column=1,rowspan=1,columnspan=1,sticky="nsew") for i in range(10): if i < 8: paramPannel.rowconfigure(i, weight=1) @@ -1687,39 +1684,43 @@ def create_param_pannel(master): else: spmDisabledListbox.insert(0, port) - + def create_test_pannel(master): - testPannel = tkinter.LabelFrame(master, text='Verification', bd=BORDER, relief='groove') - testPannel.grid(row=0, column=3, rowspan=1, columnspan=1, sticky="nsew") + dataPannel =tkinter.LabelFrame(master) + dataPannel.grid(row=0, column=2, rowspan=1, columnspan=1, sticky="nsew") + dataPannel.grid_rowconfigure(0,weight=1) + dataPannel.grid_rowconfigure(1,weight=2) + dataPannel.grid_rowconfigure(2,weight=1) + dataPannel.grid_columnconfigure(0,weight=1) + dataPannel.grid_columnconfigure(1,weight=1) + dataPannel.grid_columnconfigure(2,weight=1) + testPannel = tkinter.LabelFrame(dataPannel, text='Verification', bd=BORDER, relief='groove') + testPannel.grid(row=0,column=0,rowspan=1,columnspan=3,sticky="nsew") testButton = tkinter.Button(testPannel, text = "Run tests", relief='raised', command = clickTest) - testButton.pack(side=tkinter.LEFT, padx=4, pady=4) + testButton.grid(row=0,column=0,rowspan=1,columnspan=1,sticky=tkinter.W) testProgress = ttk.Progressbar(testPannel, orient='horizontal', mode='determinate') testProgress['value'] = 0 widgets["testProgress"] = testProgress - testProgress.pack(side=tkinter.LEFT, fill="x", padx=4, expand=True) + testProgress.grid(row=0,column=1,rowspan=1,columnspan=1,sticky="nsew") testShow = tkinter.Label(testPannel, text = " IDLE ", fg='gray') widgets["testShow"] = testShow - testShow.pack(side=tkinter.RIGHT, padx=4,pady=4) + testShow.grid(row=0,column=2,sticky=tkinter.E) -def create_verilog_pannel(master): - verilogPannel = tkinter.LabelFrame(master, text="SVerilog", bd=BORDER, relief="groove") - verilogPannel.grid(row=1, column=3, rowspan=1, columnspan=1, sticky="nesw") + verilogPannel = tkinter.LabelFrame(dataPannel,text="SVerilog",bd=BORDER,relief="groove") + verilogPannel.grid(row=1,column=0,rowspan=1,columnspan=3,sticky="nsew") CreateToolTip(verilogPannel, text = "The code might be too big to be copied,\nthe generated verilog can be found in\nthe 'verilog' folder.") generateVerilogButton = tkinter.Button(verilogPannel, text="Generate", relief='raised', command=clickGenerateVerilog) - generateVerilogButton.pack(side=tkinter.BOTTOM, anchor="se", padx=BORDER, pady=BORDER) + generateVerilogButton.pack(side=tkinter.BOTTOM, anchor="sw", padx=BORDER, pady=BORDER) verilogScroll = tkinter.Scrollbar(verilogPannel, orient="vertical") verilogScroll.pack(side=tkinter.RIGHT, fill="y") - verilogText = tkinter.Text(verilogPannel, yscrollcommand=verilogScroll.set,width=30,height=5) + verilogText = tkinter.Text(verilogPannel, yscrollcommand=verilogScroll.set,width=10,height=5) verilogText.pack(side=tkinter.LEFT, fill="both", expand=True) - verilogText.config(yscrollcommand=verilogScroll.set) verilogScroll.config(command=verilogText.yview) widgets["verilogText"] = verilogText -def create_report_pannel(master): - reportPannel = tkinter.LabelFrame(master, text='Report area/power', bd = BORDER, relief='groove') - reportPannel.grid(row=2,column=3,rowspan=1,columnspan=1,sticky='nesw') - #reportPannel.grid_configure(rows=6, columns=2) + reportPannel = tkinter.LabelFrame(dataPannel,text='Report area/power', bd = BORDER, relief='groove') + reportPannel.grid(row=2,column=0,rowspan=1,columnspan=3,sticky='nesw') reportButton = tkinter.Button(reportPannel, text="Synthesize", relief="raised", command=clickSynthesize) reportProgress = ttk.Progressbar(reportPannel, orient="horizontal", mode="determinate") @@ -1728,48 +1729,50 @@ def create_report_pannel(master): synthesisTimeEntry = tkinter.Entry(reportPannel, fg="black", justify=tkinter.CENTER) widgets["synthesisTimeEntry"] = synthesisTimeEntry - - reportTileAreaLabel = tkinter.Label(reportPannel, text = " Tiles area:") + + reportTileAreaLabel = tkinter.Label(reportPannel, text = " Tiles area") CreateToolTip(reportTileAreaLabel, text = "Area is in mm^2.") reportTileAreaData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportTileAreaData"] = reportTileAreaData - reportTilePowerLabel = tkinter.Label(reportPannel, text = "Tiles power:") + reportTilePowerLabel = tkinter.Label(reportPannel, text = "Tiles power") CreateToolTip(reportTilePowerLabel, text = "Yosys is not able to provide\npower estimation.") reportTilePowerData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportTilePowerData"] = reportTilePowerData - - reportSPMAreaLabel = tkinter.Label(reportPannel, text = " SPM area:") + + reportSPMAreaLabel = tkinter.Label(reportPannel, text = " SPM area") CreateToolTip(reportSPMAreaLabel, text = "Area is in mm^2.") reportSPMAreaData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportSPMAreaData"] = reportSPMAreaData - reportSPMPowerLabel = tkinter.Label(reportPannel, text = "SPM power:") + reportSPMPowerLabel = tkinter.Label(reportPannel, text = "SPM power") CreateToolTip(reportSPMPowerLabel, text = "Power is in mW.") reportSPMPowerData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportSPMPowerData"] = reportSPMPowerData - reportButton.grid(row=0, column=0,pady=10,padx=10) - reportProgress.grid(row=1,column=1,pady=10) - synthesisTimeEntry.grid(row=0, column=1,pady=10) + reportButton.grid(row=0, column=0) + reportProgress.grid(row=0,column=1) + synthesisTimeEntry.grid(row=1, column=0,pady=10) + + reportTileAreaLabel.grid(row=2, column=1,pady=10) + reportTileAreaData.grid(row=2, column=0,pady=10) + reportTilePowerLabel.grid(row=3, column=1,pady=10) + reportTilePowerData.grid(row=3, column=0,pady=10) + + reportSPMAreaLabel.grid(row=4, column=1,pady=10) + reportSPMAreaData.grid(row=4, column=0,pady=10) + reportSPMPowerLabel.grid(row=5, column=1,pady=10) + reportSPMPowerData.grid(row=5, column=0,pady=10) - reportTileAreaLabel.grid(row=2, column=0,pady=5) - reportTileAreaData.grid(row=2, column=1,pady=5) - reportTilePowerLabel.grid(row=3, column=0,pady=5) - reportTilePowerData.grid(row=3, column=1,pady=5) - reportSPMAreaLabel.grid(row=4, column=0,pady=5) - reportSPMAreaData.grid(row=4, column=1,pady=5) - reportSPMPowerLabel.grid(row=5, column=0,pady=5) - reportSPMPowerData.grid(row=5, column=1,pady=5) def create_layout_pannel(master): layoutPannel = tkinter.LabelFrame(master, text='Layout', bd=BORDER, relief='groove') - layoutPannel.grid(row=0, column=4,rowspan=3,columnspan=2, sticky="nsew") + layoutPannel.grid(row=0, column=3,rowspan=1,columnspan=1, sticky="nsew") canvas = tkinter.Canvas(layoutPannel, bd=0) scrollbar = tkinter.Scrollbar(layoutPannel, orient="horizontal", command=canvas.xview) scrollbar.pack(side="bottom", fill="x") @@ -1785,7 +1788,7 @@ def create_layout_pannel(master): def create_mapping_pannel(master): mappingPannel = tkinter.LabelFrame(master, text='Mapping', bd=BORDER, relief='groove') - mappingPannel.grid(row=3, column=3, rowspan=3,columnspan=4, sticky="nsew") + mappingPannel.grid(row=1, column=1, rowspan=1,columnspan=3, sticky="nsew") mappingCanvas = tkinter.Canvas(mappingPannel, bd=0) widgets["mappingCanvas"] = mappingCanvas hbar = tkinter.Scrollbar(mappingPannel, orient="horizontal", command=mappingCanvas.xview) @@ -1798,7 +1801,7 @@ def create_mapping_pannel(master): def create_kernel_pannel(master): kernelPannel = tkinter.LabelFrame(master, text="Kernel", bd=BORDER, relief='groove') - kernelPannel.grid(row=3,column=0,rowspan=3,columnspan=3,sticky="nsew") + kernelPannel.grid(row=1,column=0,rowspan=1,columnspan=1,sticky="nsew") for row in range(12): kernelPannel.grid_rowconfigure(row, weight=1) kernelPannel.grid_columnconfigure(0, weight=3) @@ -1898,15 +1901,13 @@ def create_kernel_pannel(master): #layoutPadPosX = scriptPadPosX + scriptPadWidth + INTERVAL #layoutPadWidth = 300 #layoutPadHeight = GRID_HEIGHT -master.geometry(str(1900)+"x"+str(1100)) +#master.geometry(str(1900)+"x"+str(1100)) +create_cgra_pannel(master, ROWS, COLS) +create_param_pannel(master) +create_test_pannel(master) +create_layout_pannel(master) create_kernel_pannel(master) create_mapping_pannel(master) -create_layout_pannel(master) -create_test_pannel(master) -create_verilog_pannel(master) -create_report_pannel(master) -create_cgra_pannel(master, ROWS, COLS) -create_param_pannel(master) #print(master.winfo_width()) #print(master.winfo_height()) master.mainloop() \ No newline at end of file From ba4f43b932da6f0923c44a0edba6f1ca75196c2d Mon Sep 17 00:00:00 2001 From: Wang-Yuanlu Date: Tue, 7 May 2024 14:56:34 +0800 Subject: [PATCH 15/15] GUI v8.0 --- launchUI.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/launchUI.py b/launchUI.py index c743acd..01232de 100644 --- a/launchUI.py +++ b/launchUI.py @@ -26,8 +26,8 @@ #TILE_HEIGHT = 60 #TILE_WIDTH = 60 #LINK_LENGTH = 40 -TILE_HEIGHT = 65 -TILE_WIDTH = 60 +TILE_HEIGHT = 70 +TILE_WIDTH = 70 LINK_LENGTH = 40 INTERVAL = 10 BORDER = 4 @@ -42,8 +42,8 @@ def window_size(window, width, height): window.geometry(f"{width}x{height}") master = tkinter.Tk() master.title("CGRA-Flow: An Integrated End-to-End Framework for CGRA Exploration, Compilation, and Development") -default_width = 1700 -default_height = 920 +default_width = 1725 +default_height = 970 window_size(master, default_width, default_height) master.grid_rowconfigure(0, weight=2) master.grid_rowconfigure(1, weight=3) @@ -1235,7 +1235,7 @@ def clickShowDFG(): PIL_image = Image.open("kernel.png") ImageFile.LOAD_TRUNCATED_IMAGES = True - PIL_image_small = PIL_image.resize((205, 310), Image.Resampling.LANCZOS) + PIL_image_small = PIL_image.resize((220, 330), Image.Resampling.LANCZOS) dfgImage = ImageTk.PhotoImage(PIL_image_small) images["dfgImage"] = dfgImage # This is important due to the garbage collection would remove local variable of image widgets["dfgLabel"].config(image=dfgImage) @@ -1450,7 +1450,7 @@ def create_cgra_pannel(master, rows, columns): # draw data memory memHeight = GRID_HEIGHT button = tkinter.Button(canvas, text = "Data\nSPM", fg = 'black', bg = 'gray', relief = 'raised', bd = BORDER, command = clickSPM) - button.place(height=memHeight, width=MEM_WIDTH, x = 0, y = 25) + button.place(height=memHeight, width=MEM_WIDTH, x = 25, y = 35) # construct tiles @@ -1469,7 +1469,7 @@ def create_cgra_pannel(master, rows, columns): if not tile.disabled: button = tkinter.Button(canvas, text = "Tile "+str(tile.ID), fg='black', bg='gray', relief='raised', bd=BORDER, command=partial(clickTile, tile.ID)) posX, posY = tile.getPosXY() - button.place(height=TILE_HEIGHT, width=TILE_WIDTH, x = posX, y = posY + 25) + button.place(height=TILE_HEIGHT, width=TILE_WIDTH, x = posX + 25, y = posY + 35) # construct links @@ -1531,7 +1531,7 @@ def create_cgra_pannel(master, rows, columns): else: srcX, srcY = link.getSrcXY() dstX, dstY = link.getDstXY() - canvas.create_line(srcX, srcY + 25, dstX, dstY + 25, arrow=tkinter.LAST) + canvas.create_line(srcX + 25, srcY + 35, dstX + 25, dstY + 35, arrow=tkinter.LAST) def place_fu_options(master): @@ -1562,7 +1562,7 @@ def place_xbar_options(master): if portType in paramCGRA.getTileOfID(0).neverUsedOutPorts: xbarCheckbutton.configure(state="disabled") - xbarCheckbutton.grid(row=i//4, column=i%4, padx=15, pady=15, sticky="nsew") + xbarCheckbutton.grid(row=i//4, column=i%4, padx=33, pady=30, sticky="nsew") @@ -1601,14 +1601,14 @@ def create_param_pannel(master): dataMemEntry.insert(0, str(paramCGRA.dataMemSize)) widgets["dataMemEntry"] = dataMemEntry updateButton = tkinter.Button(paramPannel, text = " Reset ", relief='raised', command = partial(clickReset, master)) - updateButton.grid(row=2, column=3, sticky=tkinter.W) + updateButton.grid(row=2, column=3) entireTileCheckVar.set(0) entireTileCheckbutton = tkinter.Checkbutton(paramPannel, variable=entireTileCheckVar, text="Disable entire Tile 0", command=clickEntireTileCheckbutton) entireTileCheckbutton.grid(columnspan=3, row=3, column=0,sticky="W") widgets["entireTileCheckbutton"] = entireTileCheckbutton resetButton = tkinter.Button(paramPannel, text = "Update", relief='raised', command = partial(clickUpdate, master)) - resetButton.grid(row=3, column=3,sticky=tkinter.W) + resetButton.grid(row=3, column=3) fuConfigPannel = tkinter.LabelFrame(paramPannel, text='Tile 0 functional units', bd = BORDER, relief='groove') fuConfigPannel.grid(columnspan=4, row=4, column=0,rowspan=3,sticky="nsew") @@ -1730,6 +1730,9 @@ def create_test_pannel(master): synthesisTimeEntry = tkinter.Entry(reportPannel, fg="black", justify=tkinter.CENTER) widgets["synthesisTimeEntry"] = synthesisTimeEntry + reportTimecostLabel = tkinter.Label(reportPannel, text = " Time cost") + CreateToolTip(reportTimecostLabel, text = "Time is in s.") + reportTileAreaLabel = tkinter.Label(reportPannel, text = " Tiles area") CreateToolTip(reportTileAreaLabel, text = "Area is in mm^2.") @@ -1754,9 +1757,11 @@ def create_test_pannel(master): reportSPMPowerData = tkinter.Entry(reportPannel, justify=tkinter.CENTER) widgets["reportSPMPowerData"] = reportSPMPowerData - reportButton.grid(row=0, column=0) - reportProgress.grid(row=0,column=1) + reportButton.grid(row=0, column=1) + reportProgress.grid(row=0,column=0) + synthesisTimeEntry.grid(row=1, column=0,pady=10) + reportTimecostLabel.grid(row=1,column=1,pady=10) reportTileAreaLabel.grid(row=2, column=1,pady=10) reportTileAreaData.grid(row=2, column=0,pady=10) @@ -1901,7 +1906,6 @@ def create_kernel_pannel(master): #layoutPadPosX = scriptPadPosX + scriptPadWidth + INTERVAL #layoutPadWidth = 300 #layoutPadHeight = GRID_HEIGHT -#master.geometry(str(1900)+"x"+str(1100)) create_cgra_pannel(master, ROWS, COLS) create_param_pannel(master) create_test_pannel(master)