GuiType.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. ###################
  2. # Gui Data Types
  3. ###################
  4. __all__ = ["_GuiForm","_GuiFormMulti","_GuiTreeRow","_GuiTree","_GuiWinText",
  5. "_GuiWinLinedText","_GuiWinForm","_GuiWinFormMulti","_GuiWinTree","_GuiSideBar",
  6. "_GuiMessage", "_GuiMessages",]
  7. class _GuiForm():
  8. def __init__(self, fixed_row, rows):
  9. self.FixedRow = fixed_row
  10. self.Rows = rows
  11. # Form = _GuiForm( ["Col1", "Col2"], [["a1","a2"],["b1","b2"],["c1","c2"]])
  12. class _GuiFormMulti():
  13. def __init__(self, name_forms):
  14. self.Names = []
  15. self.__Forms = []
  16. for nf in name_forms:
  17. self.Names.append(nf[0])
  18. self.__Forms.append(nf[1])
  19. def GetForm(self, index): # can be further modify to lazy eval
  20. return self.__Forms[index]
  21. # Forms = _GuiFormMulti([["Sheet1", _GuiForm( ["Col1", "Col2"], [["a1","a2"],["b1","b2"],["c1","c2"]])], ["Sheet2", _GuiForm( ["Col1", "Col2"], [["d1","d2"],["e1","e2"],["f1","f2"]])]])
  22. class _GuiTreeRow():
  23. def __init__(self, treerows, name, row):
  24. self.Name = name
  25. self.Row = row
  26. if treerows:
  27. self.HasSubTreeRows = True
  28. self.__SubTreeRows = treerows
  29. else:
  30. self.HasSubTreeRows = False
  31. self.__SubTreeRows = []
  32. def GetSubTreeRows(self):
  33. return self.__SubTreeRows
  34. def GetID(self):
  35. pass
  36. # TreeRow = _GuiTreeRow([], "SubDesign1", ["12", "0"])
  37. # TreeRow = _GuiTreeRow([_GuiTreeRow([], "Sub3", ["5", "0"])], "SubDesign2", ["34", "1"])
  38. class _GuiTree():
  39. def __init__(self, fixed_row, treerows:_GuiTreeRow):
  40. self.FixedRow = fixed_row
  41. self.TreeRows = treerows
  42. # Tree = _GuiTree(["","DFFs","SubModules"], [_GuiTreeRow([_GuiTreeRow([], "SubDesign1", ["12", "0"]),_GuiTreeRow([_GuiTreeRow([], "Sub3", ["5", "0"])], "SubDesign2", ["34", "1"])], "DemoDesign", ["123", "2"]),])
  43. #####################
  44. # Gui Window Types
  45. #####################
  46. class _GuiWinText():
  47. def __init__(self, title, text):
  48. self.Title = title
  49. self.Text = text
  50. class _GuiWinLinedText():
  51. def __init__(self, title, lined_text, line):
  52. self.Title = title
  53. self.LinedText = lined_text
  54. self.GotoLine = line
  55. class _GuiWinForm():
  56. def __init__(self, title, form, formtype):
  57. assert isinstance(title, str)
  58. assert isinstance(form, _GuiForm)
  59. assert formtype in {"Property", "Timing", "Clock"}
  60. self.Title = title
  61. self.Form = form
  62. self.Type = formtype
  63. self._hasCrossProbeMenu = self.Type != "Property" # property does not support crossprobe
  64. self._hasReportVirtualTimingButton = self.Type != "Property" # property does not has RVT button
  65. def CrossProbe(self, formrow):
  66. assert isinstance(formrow, list)
  67. line = 1000
  68. 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)
  69. def ReportVirtualTiming(self, formrow, _GUI):
  70. assert isinstance(formrow, list)
  71. if self.Type == "Timing":
  72. return _GUI.ReportVirtualTiming("Pins", formrow[0], "", "", "Pins", formrow[1], False, 1)
  73. else: # Clocks
  74. return _GUI.ReportVirtualTiming("Clocks", formrow[0], "", "", "Clocks", formrow[1], False, 1)
  75. class _GuiWinFormMulti():
  76. def __init__(self, title, forms, formtype):
  77. assert isinstance(title, str)
  78. assert isinstance(forms, _GuiFormMulti)
  79. assert formtype in {"Timing", "Clock"}
  80. self.Title = title
  81. self.Forms = forms
  82. self.Type = formtype
  83. def CrossProbe(self, formname, formrow):
  84. assert isinstance(formname, str)
  85. assert isinstance(formrow, list)
  86. line = 1000
  87. 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)
  88. def ReportVirtualTiming(self, formname, formrow, _GUI):
  89. assert isinstance(formname, str)
  90. assert isinstance(formrow, list)
  91. return _GUI.ReportVirtualTiming("Pins", formrow[0], "", "", "Pins", formrow[1], False, 1)
  92. class _GuiWinTree():
  93. def __init__(self, tree):
  94. self.Title = ""
  95. self.Tree = tree
  96. class _GuiSideBar():
  97. def __init__(self, title, tree:_GuiTree):
  98. self.Title = title
  99. self.Tree = tree
  100. def GetForms(self, treenames):
  101. return _GuiFormMulti([["Sheet1", _GuiForm(["Col1", "Col2"], [[treename, "ok"] for treename in treenames])], ["Sheet2", _GuiForm(["Col1", "Col2"], [[treename, "fail"] for treename in treenames])]])
  102. def CrossProbe(self, treenames, formname, formrow):
  103. assert isinstance(treenames, list)
  104. assert isinstance(formname, str) or isinstance(formname, type(None))
  105. assert isinstance(formrow, list)
  106. line = 1000
  107. return _GuiWinLinedText(str(formrow), ("Text Start\n\n"+'\n'.join(['generated line '+str(x) for x in range(3, line*2)])+'\n'.join([str(x) for x in treenames])+str(formname)+"\n\nText End").split("\n"), line)
  108. def Properties(self, treenames, formname, formrow):
  109. assert isinstance(treenames, list)
  110. assert isinstance(formname, (str, type(None)))
  111. assert isinstance(formrow, list)
  112. return _GuiWinForm(str(formname)+" Properties", _GuiForm(["Name", "Property"], [[x, "property"] for x in treenames+formrow]), "Property")
  113. class _GuiMessage(): # _GuiMessage("This is an error!!!", 100, "/x/xx.v")
  114. def __init__(self, text, line, filepath):
  115. self.Text = text
  116. self.Line = line
  117. self.FilePath = filepath
  118. def GetHint(self):
  119. return "line: "+str(self.Line)+", file: "+self.FilePath
  120. def CrossProbe(self):
  121. 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)
  122. def Properties(self):
  123. return _GuiWinForm("Message Properties", _GuiForm(["Name", "Property"], [["File", self.FilePath], ["Line", str(self.Line)]]), "Property")
  124. 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")]]])
  125. def __init__(self, id_messages):
  126. self.Size = 0
  127. self._summary = []
  128. self._messages = {}
  129. for idm in id_messages:
  130. assert len(idm) == 3
  131. assert isinstance(idm[0], str) and idm[0] != "" # "Err-123"
  132. assert isinstance(idm[1], str) # "This is an error"
  133. assert isinstance(idm[2], list) and len(idm[2]) > 0 # [_GuiMessage(), _GuiMessage()]
  134. self.Size += len(idm[2])
  135. self._summary.append([idm[0], len(idm[2]), idm[1]])
  136. self._messages[idm[0]] = idm[2]
  137. def GetSummary(self): # [["Err-123", 2, "This is an error"],]
  138. return self._summary
  139. def GetMsgByID(self, ID): # [_GuiMessage(), _GuiMessage()]
  140. return self._messages[ID]