Package empro :: Package toolkit :: Package analysis :: Package dc :: Module topology
[frames] | no frames]

Source Code for Module empro.toolkit.analysis.dc.topology

  1  # Copyright 1983-2018 Keysight Technologies, Inc, Keysight Confidential 
2 -class TopologyConnection:
3 - def __init__(self, to, label=""):
4 self.to = to 5 self.label = label
6
7 - def __eq__(self, other):
8 if other is None: 9 return False 10 if self.to == other.to and self.label == other.label: 11 return True 12 return False
13
14 - def __hash__(self):
15 return hash((self.to, self.label))
16
17 -class TopologyElement:
18 VRM = 1 19 SINK = 2 20 COMPONENT = 3 21 SENSE = 4 22 SWITCHVRM = 5 23 UNKNOWN = 6 24
25 - def __init__(self, iterator, obj, type, color, metaData = None):
26 self._inputs = set() 27 self._outputs = set() 28 self.vrmIterator = iterator 29 self.obj = obj 30 self.type = type 31 self.color = color 32 self.metaData = metaData
33
34 - def addInput(self, connection):
35 self._inputs.add(connection)
36
37 - def inputs(self):
38 return self._inputs
39
40 - def addOutput(self, connection):
41 self._outputs.add(connection)
42
43 - def outputs(self):
44 return self._outputs
45
46 - def __eq__(self, other):
47 if other is None: 48 return False 49 if self.obj.name == other.obj.name and self.type == other.type and self.vrmIterator == other.vrmIterator: 50 return True 51 return False
52
53 - def __hash__(self):
54 return hash((self.obj.name, self.type))
55
56 -class Topology:
57 - def __init__(self):
58 self._topology = [] 59 self._row = -1 # at the beginning topology will be empty 60 self._column = 0 61 self._previousIt = 0 # we want a power tree per VRM 62 self._senseLines = []
63
64 - def addElement(self, element):
65 pos = self.position(element) 66 if pos is not None: 67 return self._topology[pos[0]][pos[1]] 68 if self._row == -1: 69 self.addRow() 70 while len(self._topology[self._row]) < self._column: 71 self._topology[self._row].append(None) 72 self._topology[self._row].insert(self._column,element) 73 self._column +=1 74 return element
75
76 - def insertSenseElement(self, senseElement, rowNr, columnNr):
77 while len(self._topology) < rowNr+1: 78 self.addRow() 79 for element in self._topology[rowNr]: 80 if element is None: 81 continue 82 if element.type != TopologyElement.SENSE: 83 self.insertRow(rowNr) 84 break 85 while len(self._topology[rowNr]) < columnNr: 86 self._topology[rowNr].append(None) 87 self._topology[rowNr].insert(columnNr,senseElement)
88
89 - def resetColumn(self):
90 self._column = 0
91
92 - def setPreviousIterator(self,iterator):
93 self._previousIt = iterator
94
95 - def addSenseLine(self, senseLine):
96 self._senseLines.append(senseLine)
97
98 - def topology(self):
99 return self._topology
100
101 - def addRow(self):
102 self._topology.append([]) 103 self._row += 1 104 if self._column > 0: 105 self._column -=1
106
107 - def insertRow(self, rowNr):
108 self._topology.insert(rowNr, [])
109
110 - def removeRow(self, index):
111 if index < len(self._topology): 112 del self._topology[index]
113
114 - def addConnection(self, fromElement, toElement, outLabel="", inLabel=""):
115 fromElement.addOutput(TopologyConnection(toElement, outLabel)) 116 toElement.addInput(TopologyConnection(fromElement, inLabel))
117
118 - def build(self):
119 maxCol = 0 120 # remove empty rows 121 rowsToRemove=[] 122 for index,row in enumerate(self._topology): 123 if not row: 124 rowsToRemove.append(index) 125 rowsToRemove.sort(reverse=True) 126 for index in rowsToRemove: 127 self.removeRow(index) 128 129 for senseLine in self._senseLines: 130 pos = self.positionByName(senseLine.obj.vrmName) 131 rowNr = pos[0] + 1 #add a sense line on the next row 132 columnNr = pos[1] 133 self.insertSenseElement(senseLine, rowNr, columnNr) 134 135 return self
136
137 - def position(self, _element):
138 for row in self._topology: 139 for element in row: 140 if element == _element: 141 return (self._topology.index(row), row.index(element)) 142 return None
143
144 - def positionByName(self, name):
145 for row in self._topology: 146 for element in row: 147 if element is not None and element.obj.name == name: 148 return (self._topology.index(row), row.index(element)) 149 return None
150