Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / src / nas,5.n2.os.2 / pfe / SS_Break.py
CommitLineData
86530b38
AT
1
2break_type_name = {}
3
4class BreakPoint:
5 def __init__(self,strand,vonk,breakp):
6 self.__strand__ = strand
7 self.__vonk__ = vonk
8 self.__breakp__ = breakp
9
10 def is_enabled(self):
11 return self.__breakp__.enabled
12 def enable(self):
13 self.__strand__.break_enable(self.__breakp__.id)
14 def disable(self):
15 self.__strand__.break_disable(self.__breakp__.id)
16
17 def __repr__(self):
18 type_name = break_type_name[self.__breakp__.type]
19 s = '<type='+type_name
20 if type_name == 'trap':
21 s += '('+str(self.__breakp__.tt)+')'
22 elif (type_name == 'inst_va'):
23 s += '('+str(self.__breakp__.va)+')'
24 elif (type_name == 'inst_pa'):
25 s += '('+str(self.__breakp__.pa)+')'
26 if self.is_enabled():
27 s += ',enabled>'
28 else:
29 s += ',disabled>'
30 return s
31
32 def __str__(self):
33 type_name = break_type_name[self.__breakp__.type]
34 s = 'brk['+str(self.__breakp__.id)+'] '+type_name+' '
35 if type_name == 'trap' or type_name == 'all_trap':
36 tt = self.__breakp__.tt
37 return s+'tt='+self.__vonk__.get_trap_info(tt).name+'('+hex(tt)+')'
38 elif type_name == 'red_mode':
39 return s+'entered'
40 return s
41
42
43class BreakIter:
44 def __init__(self,strand,vonk):
45 self.__strand__ = strand
46 self.__vonk__ = vonk
47 self.__breakp__ = strand.break_points
48
49 def __iter__(self):
50 return self
51
52 def next(self):
53 if self.__breakp__:
54 breakp = self.__breakp__
55 self.__breakp__ = self.__breakp__.next
56 return (breakp.id, BreakPoint(self.__strand__,self.__vonk__,breakp))
57 raise StopIteration
58
59
60class BreakDict(dict):
61 def __init__(self,strand,vonk):
62 dict.__init__(self)
63 self.__strand__ = strand
64 self.__vonk__ = vonk
65 self.callback = {}
66
67 break_trap_info = vonk.get_trap_info
68
69 if len(break_type_name) == 0:
70 for on in vonk.SS_BreakPoint.__dict__:
71 if on[0:3] == 'ON_':
72 break_type_name[vonk.SS_BreakPoint.__dict__[on]] = on[3:].lower()
73
74 def __iter__(self):
75 return BreakIter(self.__strand__,self.__vonk__)
76
77 def __len__(self):
78 n = 0
79 for b in self.__iter__():
80 n += 1
81 return n
82
83 def __repr__(self):
84 l = {}
85 for id,bp in self.__iter__():
86 l[id] = bp
87 return str(l)
88
89 def keys(self):
90 l = []
91 for id,bp in self.__iter__():
92 l.append(id)
93 return l
94
95 def items(self):
96 l = []
97 for id,bp in self.__iter__():
98 l.append(bp)
99 return l
100
101 def __getitem__(self,index):
102 for id,bp in self.__iter__():
103 if id == index:
104 return bp
105 raise IndexError
106
107 def __setitem__(self,index):
108 raise Exception('Breakpoint dictionary is read-only')
109
110 def __delitem__(self,index):
111 if self.__strand__.break_delete(index) != 0:
112 raise IndexError
113 del self.callback[index]
114
115 def on_inst_va(self,va,callback=None):
116 id = self.__strand__.break_on_inst_va(va)
117 self.callback[id] = callback
118 return id
119
120 def on_red_mode(self,callback=None):
121 id = self.__strand__.break_on_red_mode()
122 self.callback[id] = callback
123 return id
124
125 def on_trap(self,traptype,callback=None):
126 id = self.__strand__.break_on_trap(traptype)
127 self.callback[id] = callback
128 return id
129
130 def hit_id(self):
131 bp = self.__strand__.break_hit
132 if bp:
133 return bp.id
134 else:
135 return None
136
137 def hit_bp(self):
138 bp = self.__strand__.break_hit
139 if bp:
140 return BreakPoint(self.__strand__,self.__vonk__,bp)
141 else:
142 return None
143
144 def hit(self):
145 bp = self.__strand__.break_hit
146 if bp:
147 return bp.id,BreakPoint(self.__strand__,self.__vonk__,bp)
148 else:
149 return None
150
151
152
153