Browse Source

_GuiWinForm和_GuiWinFormMulti需要增加一个初始化参数formtype
Property窗口不需要ReportVirtualTiming按钮和CrossProbe菜单
Property窗口实现 ReportVirtualTiming按钮功能调用

mrh 2 years ago
parent
commit
38d026a720
9 changed files with 129 additions and 30 deletions
  1. 2 6
      GuiShell.py
  2. 41 13
      GuiType.py
  3. 0 1
      gui.py
  4. 2 0
      main_windows.py
  5. 46 8
      sub_windows.py
  6. 18 1
      ui/ReportClocks.ui
  7. 18 1
      ui/ReportVirtualTiming.ui
  8. 1 0
      ui/ui_ReportClocks.py
  9. 1 0
      ui/ui_ReportVirtualTiming.py

+ 2 - 6
GuiShell.py

@@ -10,9 +10,6 @@ import rlcompleter
 import traceback
 from PySide2.QtCore import QObject, QThread, Signal
 import gui 
-# from GuiType import (_GuiForm,_GuiFormMulti,_GuiTreeRow,_GuiTree,_GuiWinText,
-#                     _GuiWinLinedText,_GuiWinForm,_GuiWinFormMulti,_GuiWinTree,_GuiSideBar,
-#                     _GuiMessage, _GuiMessages,)
 from GuiType import *
 
 class _GuiMain():
@@ -162,10 +159,9 @@ class _GuiMain():
                             "e1", "e2", "0.5"], ["f1", "f2", "0.6"]])
         forms = _GuiFormMulti(
             [["MCP", form_mcp], ["FP", form_fp], ["MDP", form_mdp]])
-        # return _GuiWinFormMulti(title, forms)
         print("Names:", forms.Names)
         gui.signale("Ready")
-        return gui.signale(_GuiWinFormMulti(title, forms))
+        return gui.signale(_GuiWinFormMulti(title, forms, "Timing"))
 
     def ReportClocks(self, start, end, exclude, autogen, include_async):
         assert isinstance(start, str)
@@ -193,7 +189,7 @@ class _GuiMain():
         rows = [["CLKA", "DFFA/Q", "CLKB", "DFFB/D", "Sync"],
             ["CLKB", "DFFB/Q", "CLKA", "DFFA/D", "Async"]]
         form = _GuiForm(fixed_row, rows)
-        return gui.signale(_GuiWinForm(title, form))
+        return gui.signale(_GuiWinForm(title, form, "Clock"))
 
     def ReportVirtualTiming(self, from_type, from_, thru_type, thru, to_type, to, flat, limit):
         assert from_type in ("", "Clocks", "Pins", "Registers")

+ 41 - 13
GuiType.py

@@ -1,9 +1,6 @@
 ###################
 #  Gui Data Types
 ###################
-# from GuiType import (_GuiForm,_GuiFormMulti,_GuiTreeRow,_GuiTree,_GuiWinText,
-#                     _GuiWinLinedText,_GuiWinForm,_GuiWinFormMulti,_GuiWinTree,_GuiSideBar,
-#                     _GuiMessage, _GuiMessages,)
 __all__ = ["_GuiForm","_GuiFormMulti","_GuiTreeRow","_GuiTree","_GuiWinText",
             "_GuiWinLinedText","_GuiWinForm","_GuiWinFormMulti","_GuiWinTree","_GuiSideBar",
             "_GuiMessage", "_GuiMessages",]
@@ -77,17 +74,48 @@ class _GuiWinLinedText():
         self.LinedText = lined_text
         self.GotoLine = line
 
-
 class _GuiWinForm():
-    def __init__(self, title, form):
-        self.Title = title
-        self.Form = form
-
+	def __init__(self, title, form, formtype):
+		assert isinstance(title, str)
+		assert isinstance(form, _GuiForm)
+		assert formtype in {"Property", "Timing", "Clock"}
+		self.Title = title
+		self.Form = form
+		self.Type = formtype
+		self._hasCrossProbeMenu            = self.Type != "Property"  # property does not support crossprobe
+		self._hasReportVirtualTimingButton = self.Type != "Property"  # property does not has RVT button
+	
+	def CrossProbe(self, formrow):
+		assert isinstance(formrow, list)
+		line = 1000
+		return _GuiWinLinedText(str(formrow), ("Text Start\n\n"+'\n'.join(['generated line '+str(x) for x in range(3, line*2)])+"\n\nText End").split("\n"), line)
+	
+	def ReportVirtualTiming(self, formrow, _GUI):
+		assert isinstance(formrow, list)
+		if self.Type == "Timing":
+			return _GUI.ReportVirtualTiming("Pins", formrow[0], "", "", "Pins", formrow[1], False, 1)
+		else: # Clocks
+			return _GUI.ReportVirtualTiming("Clocks", formrow[0], "", "", "Clocks", formrow[1], False, 1)
 
 class _GuiWinFormMulti():
-    def __init__(self, title, forms):
-        self.Title = title
-        self.Forms = forms
+	def __init__(self, title, forms, formtype):
+		assert isinstance(title, str)
+		assert isinstance(forms, _GuiFormMulti)
+		assert formtype in {"Timing", "Clock"}
+		self.Title = title
+		self.Forms = forms
+		self.Type = formtype
+
+	def CrossProbe(self, formname, formrow):
+		assert isinstance(formname, str)
+		assert isinstance(formrow, list)
+		line = 1000
+		return _GuiWinLinedText(str(formrow), ("Text Start\n\n"+'\n'.join(['generated line '+str(x) for x in range(3, line*2)])+"\n"+formname+"\n\nText End").split("\n"), line)
+   
+	def ReportVirtualTiming(self, formname, formrow, _GUI):
+		assert isinstance(formname, str)
+		assert isinstance(formrow, list)
+		return _GUI.ReportVirtualTiming("Pins", formrow[0], "", "", "Pins", formrow[1], False, 1)
 
 
 class _GuiWinTree():
@@ -115,7 +143,7 @@ class _GuiSideBar():
         assert isinstance(treenames, list)
         assert isinstance(formname, (str, type(None)))
         assert isinstance(formrow, list)
-        return _GuiWinForm(str(formname)+" Properties", _GuiForm(["Name", "Property"], [[x, "property"] for x in treenames+formrow]))
+        return _GuiWinForm(str(formname)+" Properties", _GuiForm(["Name", "Property"], [[x, "property"] for x in treenames+formrow]), "Property")
 
 class _GuiMessage():  # _GuiMessage("This is an error!!!", 100, "/x/xx.v")
     def __init__(self, text, line, filepath):
@@ -127,7 +155,7 @@ class _GuiMessage():  # _GuiMessage("This is an error!!!", 100, "/x/xx.v")
     def CrossProbe(self):
         return _GuiWinLinedText(self.FilePath, ("Text Start\n\n"+'\n'.join(['generated line '+str(x) for x in range(3, self.Line*2)])+"\n\nText End").split("\n"), self.Line)
     def Properties(self):
-        return _GuiWinForm("Message Properties", _GuiForm(["Name", "Property"], [["File", self.FilePath], ["Line", str(self.Line)]]))
+        return _GuiWinForm("Message Properties", _GuiForm(["Name", "Property"], [["File", self.FilePath], ["Line", str(self.Line)]]), "Property")
 
 class _GuiMessages():  # _GuiMessages([["Err-123","This is an error",[_GuiMessage("This is an error!", 100, "/x/x.v"),_GuiMessage("This is an error!!", 200, "/xx/xx.v")]]])
     def __init__(self, id_messages):

+ 0 - 1
gui.py

@@ -25,7 +25,6 @@ def run_forever(GUI):
     mainWindows = MainWindow(GUI)
     mainWindows.sig.connect(handle_signal)
     GUI.Elaborate("top", True)
-    mainWindows.report_virtual_timing()
     app.exec_()
     
 def run_in_thread(GUI:QObject):

+ 2 - 0
main_windows.py

@@ -170,6 +170,8 @@ class MainWindow(Ui_MainWindow, QMainWindow):
         widget:QTextBrowser = self.focusWidget()
         if type(widget) not in (QTextBrowser, QTextEdit):
             return
+        if widget.isReadOnly():
+            return
         widget.textCursor().insertText(clipboard.text())
 
     

+ 46 - 8
sub_windows.py

@@ -1,3 +1,4 @@
+import threading
 from PySide2 import QtCore
 from PySide2.QtUiTools import QUiLoader
 from PySide2.QtWidgets import *
@@ -83,6 +84,11 @@ class FormWindow(Ui_Form, MdiActionWindow):
         mdiArea:QMdiArea = mainWindow.mdiArea
         self.instan = instan
         self.setWindowTitle(instan.Title)
+        self.reportButton.clicked.connect(self.report_virtual_timing)
+        self.reportButton.setHidden(not instan._hasReportVirtualTimingButton)
+        if instan._hasCrossProbeMenu:
+            self.tableView.customContextMenuRequested.connect(self.right_click_menu)
+
         self.tableView.setModel(FormWindow.get_form_model(self.instan.Form))
         self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
         
@@ -115,6 +121,28 @@ class FormWindow(Ui_Form, MdiActionWindow):
         if width < win.width():
             width = win.width()
         return width
+
+    def right_click_menu(self, pos):
+        pop_menu  = QMenu()
+        pop_menu.addAction(QAction('Crossprobe', pop_menu))
+        pop_menu.triggered.connect(self.crossprobe)
+        pop_menu.exec_(QCursor.pos())
+
+    def get_row(tableView:QTableView):
+        form_row = []
+        for col in range(tableView.model().columnCount()):
+            form_row.append(tableView.model().index(tableView.currentIndex().row(), col).data())
+        return form_row
+    
+    def crossprobe(self, action):
+        form_row = FormWindow.get_row(self.tableView)
+        line_text_win = self.instan.CrossProbe(form_row)
+        LineEditWin(self.mainWindow, line_text_win)
+    
+    def report_virtual_timing(self):
+        form_row = FormWindow.get_row(self.tableView)
+        thread = threading.Thread(target=self.instan.ReportVirtualTiming, args=(form_row, self.mainWindow.GUI,))
+        thread.start()
         
 class MultiFormWin(Ui_Form, MdiActionWindow):
     def __init__(self, mainWindow, instan:GuiType._GuiWinFormMulti) -> None:
@@ -126,7 +154,7 @@ class MultiFormWin(Ui_Form, MdiActionWindow):
         
         self.instan = instan
         self.sheets.activated.connect(lambda index: MultiFormWin.activate_table_sheet(self.tableView, self.instan.Forms, index))
-        self.reportButton.clicked.connect(self.report_table)
+        self.reportButton.clicked.connect(self.report_virtual_timing)
 
         mdiArea:QMdiArea = mainWindow.mdiArea
         mdisub = mdiArea.addSubWindow(self)
@@ -147,10 +175,17 @@ class MultiFormWin(Ui_Form, MdiActionWindow):
     def activate_table_sheet(tableView, form_multi_instan, index):
         model = FormWindow.get_form_model(form_multi_instan.GetForm(index))
         tableView.setModel(model)
-        print("active sheet")
     
-    def report_table(self):
-        print("report test")
+    def crossprobe(self, action):
+        form_row = FormWindow.get_row(self.tableView)
+        form_name = self.sheets.currentText()
+        line_text_win = self.instan.CrossProbe(form_name, form_row)
+        LineEditWin(self.mainWindow, line_text_win)
+    
+    def report_virtual_timing(self):
+        form_row = FormWindow.get_row(self.tableView)
+        thread = threading.Thread(target=self.instan.ReportVirtualTiming, args=(self.sheets.currentText(), form_row, self.mainWindow.GUI,))
+        thread.start()
     
     def init_multi_form_ui(self):
         self.horizontalLayout_2 = QHBoxLayout()
@@ -181,16 +216,18 @@ class MultiFormWin(Ui_Form, MdiActionWindow):
     def right_click_menu(self, pos):
         pop_menu  = QMenu()
         pop_menu.addAction(QAction('Crossprobe', pop_menu))
-        pop_menu.triggered.connect(lambda action: print(self.tableView.currentIndex().data()))
+        pop_menu.triggered.connect(self.crossprobe)
         pop_menu.exec_(QCursor.pos())
-    
+
+        
 
 class TreeWidgetItem(QTreeWidgetItem):
     def __init__(self, parent: int, tree_row:GuiType._GuiTreeRow):
         super().__init__(parent)    
         self.tree_row = tree_row
 
-class LineTextWin(Ui_LineEdit, MdiActionWindow):
+
+class TextBrowserWin(Ui_LineEdit, MdiActionWindow):
     def __init__(self, mainWindow, instance:GuiType._GuiWinText) -> None:
         super().__init__(mainWindow)
         self.setupUi(self)
@@ -205,6 +242,7 @@ class LineTextWin(Ui_LineEdit, MdiActionWindow):
         self.mdisubwin.show()
         self.mdisubwin.move(ensure_subwin_in_midarea(mainWindow.mdiArea, self))
         
+        
 class LineEditWin(Ui_LineEdit, MdiActionWindow):
     def __init__(self, mainWindow, instance:GuiType._GuiWinLinedText) -> None:
         super().__init__(mainWindow)
@@ -453,7 +491,7 @@ class SubWindows(QObject):
             GuiType._GuiWinFormMulti: lambda: MultiFormWin(self.ui, instance),
             GuiType._GuiSideBar: lambda: self.side_bar.init_win_data(instance),
             GuiType._GuiWinForm: lambda: FormWindow(self.ui, instance),
-            GuiType._GuiWinText: lambda: LineTextWin(self.ui, instance),
+            GuiType._GuiWinText: lambda: TextBrowserWin(self.ui, instance),
         }
         win_info.get(type(instance))()
         return

+ 18 - 1
ui/ReportClocks.ui

@@ -162,5 +162,22 @@
   </layout>
  </widget>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>btn_cancel</sender>
+   <signal>clicked()</signal>
+   <receiver>ReportClocks</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>173</x>
+     <y>148</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>132</x>
+     <y>88</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>

+ 18 - 1
ui/ReportVirtualTiming.ui

@@ -224,5 +224,22 @@
   </layout>
  </widget>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>btn_cancel</sender>
+   <signal>clicked()</signal>
+   <receiver>ReportVirtualTiming</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>199</x>
+     <y>190</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>158</x>
+     <y>112</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
 </ui>

+ 1 - 0
ui/ui_ReportClocks.py

@@ -117,6 +117,7 @@ class Ui_ReportClocks(object):
 
 
         self.retranslateUi(ReportClocks)
+        self.btn_cancel.clicked.connect(ReportClocks.close)
 
         QMetaObject.connectSlotsByName(ReportClocks)
     # setupUi

+ 1 - 0
ui/ui_ReportVirtualTiming.py

@@ -148,6 +148,7 @@ class Ui_ReportVirtualTiming(object):
 
 
         self.retranslateUi(ReportVirtualTiming)
+        self.btn_cancel.clicked.connect(ReportVirtualTiming.close)
 
         QMetaObject.connectSlotsByName(ReportVirtualTiming)
     # setupUi