testTracers.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. # Copyright 2014 Modelling, Simulation and Design Lab (MSDL) at
  2. # McGill University and the University of Antwerp (http://msdl.cs.mcgill.ca/)
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. from testutils import *
  16. from tracers import *
  17. from tracerVCD import VCDRecord
  18. import os
  19. class StubTracers(Tracers):
  20. def __init__(self):
  21. self.called = []
  22. self.cell = False
  23. def verboseInternal(self, model):
  24. self.called.append(("verboseInternal", model))
  25. def xmlInternal(self, model):
  26. self.called.append(("xmlInternal", model))
  27. def vcdInternal(self, model):
  28. self.called.append(("vcdInternal", model))
  29. def verboseExternal(self, model):
  30. self.called.append(("verboseExternal", model))
  31. def xmlExternal(self, model):
  32. self.called.append(("xmlExternal", model))
  33. def vcdExternal(self, model):
  34. self.called.append(("vcdExternal", model))
  35. def verboseInit(self, model):
  36. self.called.append(("verboseInit", model))
  37. def xmlInit(self, model):
  38. self.called.append(("xmlInit", model))
  39. def vcdInit(self, model):
  40. self.called.append(("vcdInit", model))
  41. def verboseConfluent(self, model):
  42. self.called.append(("verboseConfluent", model))
  43. def xmlConfluent(self, model):
  44. self.called.append(("xmlConfluent", model))
  45. def vcdConfluent(self, model):
  46. self.called.append(("vcdConfluent", model))
  47. def initXML(self):
  48. self.called.append("initXML")
  49. def initVCD(self):
  50. self.called.append("initVCD")
  51. class TestTracers(unittest.TestCase):
  52. def setUp(self):
  53. pass
  54. def tearDown(self):
  55. try:
  56. os.remove("devstrace.xml")
  57. except OSError:
  58. pass
  59. try:
  60. os.remove("devstrace.vcd")
  61. except OSError:
  62. pass
  63. try:
  64. os.remove("devstrace.out")
  65. except OSError:
  66. pass
  67. def test_VCDRecord(self):
  68. a = VCDRecord(1, "abc.def", "inport")
  69. self.assertTrue(a.modelName == "abc.def")
  70. self.assertTrue(a.bitSize == None)
  71. self.assertTrue(a.identifier == 1)
  72. self.assertTrue(a.portName == "inport")
  73. def test_tracers_internal(self):
  74. model = Generator()
  75. tracer = StubTracers()
  76. tracer.verbose = False
  77. tracer.xml = False
  78. tracer.vcd = False
  79. tracer.tracesInternal(model)
  80. self.assertTrue(tracer.called.count(("verboseInternal", model)) == 0)
  81. self.assertTrue(tracer.called.count(("xmlInternal", model)) == 0)
  82. self.assertTrue(tracer.called.count(("vcdInternal", model)) == 0)
  83. tracer = StubTracers()
  84. tracer.verbose = True
  85. tracer.xml = False
  86. tracer.vcd = False
  87. tracer.tracesInternal(model)
  88. self.assertTrue(tracer.called.count(("verboseInternal", model)) == 1)
  89. self.assertTrue(tracer.called.count(("xmlInternal", model)) == 0)
  90. self.assertTrue(tracer.called.count(("vcdInternal", model)) == 0)
  91. tracer = StubTracers()
  92. tracer.verbose = False
  93. tracer.xml = True
  94. tracer.vcd = False
  95. tracer.tracesInternal(model)
  96. self.assertTrue(tracer.called.count(("verboseInternal", model)) == 0)
  97. self.assertTrue(tracer.called.count(("xmlInternal", model)) == 1)
  98. self.assertTrue(tracer.called.count(("vcdInternal", model)) == 0)
  99. tracer = StubTracers()
  100. tracer.verbose = False
  101. tracer.xml = False
  102. tracer.vcd = True
  103. tracer.tracesInternal(model)
  104. self.assertTrue(tracer.called.count(("verboseInternal", model)) == 0)
  105. self.assertTrue(tracer.called.count(("xmlInternal", model)) == 0)
  106. self.assertTrue(tracer.called.count(("vcdInternal", model)) == 1)
  107. tracer = StubTracers()
  108. tracer.verbose = True
  109. tracer.xml = True
  110. tracer.vcd = True
  111. tracer.tracesInternal(model)
  112. self.assertTrue(tracer.called.count(("verboseInternal", model)) == 1)
  113. self.assertTrue(tracer.called.count(("xmlInternal", model)) == 1)
  114. self.assertTrue(tracer.called.count(("vcdInternal", model)) == 1)
  115. def test_tracers_init(self):
  116. model = Generator()
  117. tracer = StubTracers()
  118. tracer.verbose = False
  119. tracer.xml = False
  120. tracer.vcd = False
  121. tracer.tracesInit(model)
  122. self.assertTrue(tracer.called.count(("verboseInit", model)) == 0)
  123. self.assertTrue(tracer.called.count(("xmlInit", model)) == 0)
  124. self.assertTrue(tracer.called.count(("vcdInit", model)) == 0)
  125. tracer = StubTracers()
  126. tracer.verbose = True
  127. tracer.xml = False
  128. tracer.vcd = False
  129. tracer.tracesInit(model)
  130. self.assertTrue(tracer.called.count(("verboseInit", model)) == 1)
  131. self.assertTrue(tracer.called.count(("xmlInit", model)) == 0)
  132. self.assertTrue(tracer.called.count(("vcdInit", model)) == 0)
  133. tracer = StubTracers()
  134. tracer.verbose = False
  135. tracer.xml = True
  136. tracer.vcd = False
  137. tracer.tracesInit(model)
  138. self.assertTrue(tracer.called.count(("verboseInit", model)) == 0)
  139. self.assertTrue(tracer.called.count(("xmlInit", model)) == 1)
  140. self.assertTrue(tracer.called.count(("vcdInit", model)) == 0)
  141. tracer = StubTracers()
  142. tracer.verbose = False
  143. tracer.xml = False
  144. tracer.vcd = True
  145. tracer.tracesInit(model)
  146. self.assertTrue(tracer.called.count(("verboseInit", model)) == 0)
  147. self.assertTrue(tracer.called.count(("xmlInit", model)) == 0)
  148. self.assertTrue(tracer.called.count(("vcdInit", model)) == 1)
  149. tracer = StubTracers()
  150. tracer.verbose = True
  151. tracer.xml = True
  152. tracer.vcd = True
  153. tracer.tracesInit(model)
  154. self.assertTrue(tracer.called.count(("verboseInit", model)) == 1)
  155. self.assertTrue(tracer.called.count(("xmlInit", model)) == 1)
  156. self.assertTrue(tracer.called.count(("vcdInit", model)) == 1)
  157. def test_tracers_external(self):
  158. model = Generator()
  159. tracer = StubTracers()
  160. tracer.verbose = False
  161. tracer.xml = False
  162. tracer.vcd = False
  163. tracer.tracesExternal(model)
  164. self.assertTrue(tracer.called.count(("verboseExternal", model)) == 0)
  165. self.assertTrue(tracer.called.count(("xmlExternal", model)) == 0)
  166. self.assertTrue(tracer.called.count(("vcdExternal", model)) == 0)
  167. tracer = StubTracers()
  168. tracer.verbose = True
  169. tracer.xml = False
  170. tracer.vcd = False
  171. tracer.tracesExternal(model)
  172. self.assertTrue(tracer.called.count(("verboseExternal", model)) == 1)
  173. self.assertTrue(tracer.called.count(("xmlExternal", model)) == 0)
  174. self.assertTrue(tracer.called.count(("vcdExternal", model)) == 0)
  175. tracer = StubTracers()
  176. tracer.verbose = False
  177. tracer.xml = True
  178. tracer.vcd = False
  179. tracer.tracesExternal(model)
  180. self.assertTrue(tracer.called.count(("verboseExternal", model)) == 0)
  181. self.assertTrue(tracer.called.count(("xmlExternal", model)) == 1)
  182. self.assertTrue(tracer.called.count(("vcdExternal", model)) == 0)
  183. tracer = StubTracers()
  184. tracer.verbose = False
  185. tracer.xml = False
  186. tracer.vcd = True
  187. tracer.tracesExternal(model)
  188. self.assertTrue(tracer.called.count(("verboseExternal", model)) == 0)
  189. self.assertTrue(tracer.called.count(("xmlExternal", model)) == 0)
  190. self.assertTrue(tracer.called.count(("vcdExternal", model)) == 1)
  191. tracer = StubTracers()
  192. tracer.verbose = True
  193. tracer.xml = True
  194. tracer.vcd = True
  195. tracer.tracesExternal(model)
  196. self.assertTrue(tracer.called.count(("verboseExternal", model)) == 1)
  197. self.assertTrue(tracer.called.count(("xmlExternal", model)) == 1)
  198. self.assertTrue(tracer.called.count(("vcdExternal", model)) == 1)
  199. def test_tracers_confluent(self):
  200. model = Generator()
  201. tracer = StubTracers()
  202. tracer.verbose = False
  203. tracer.xml = False
  204. tracer.vcd = False
  205. tracer.tracesConfluent(model)
  206. self.assertTrue(tracer.called.count(("verboseConfluent", model)) == 0)
  207. self.assertTrue(tracer.called.count(("xmlConfluent", model)) == 0)
  208. self.assertTrue(tracer.called.count(("vcdConfluent", model)) == 0)
  209. tracer = StubTracers()
  210. tracer.verbose = True
  211. tracer.xml = False
  212. tracer.vcd = False
  213. tracer.tracesConfluent(model)
  214. self.assertTrue(tracer.called.count(("verboseConfluent", model)) == 1)
  215. self.assertTrue(tracer.called.count(("xmlConfluent", model)) == 0)
  216. self.assertTrue(tracer.called.count(("vcdConfluent", model)) == 0)
  217. tracer = StubTracers()
  218. tracer.verbose = False
  219. tracer.xml = True
  220. tracer.vcd = False
  221. tracer.tracesConfluent(model)
  222. self.assertTrue(tracer.called.count(("verboseConfluent", model)) == 0)
  223. self.assertTrue(tracer.called.count(("xmlConfluent", model)) == 1)
  224. self.assertTrue(tracer.called.count(("vcdConfluent", model)) == 0)
  225. tracer = StubTracers()
  226. tracer.verbose = False
  227. tracer.xml = False
  228. tracer.vcd = True
  229. tracer.tracesConfluent(model)
  230. self.assertTrue(tracer.called.count(("verboseConfluent", model)) == 0)
  231. self.assertTrue(tracer.called.count(("xmlConfluent", model)) == 0)
  232. self.assertTrue(tracer.called.count(("vcdConfluent", model)) == 1)
  233. tracer = StubTracers()
  234. tracer.verbose = True
  235. tracer.xml = True
  236. tracer.vcd = True
  237. tracer.tracesConfluent(model)
  238. self.assertTrue(tracer.called.count(("verboseConfluent", model)) == 1)
  239. self.assertTrue(tracer.called.count(("xmlConfluent", model)) == 1)
  240. self.assertTrue(tracer.called.count(("vcdConfluent", model)) == 1)
  241. def test_initXML(self):
  242. tracer = Tracers()
  243. tracer.setXML(True, "devstrace.xml")
  244. tracer.initXML()
  245. tracer.xml_file.close()
  246. f = open("devstrace.xml", 'r')
  247. c = 0
  248. for l in f:
  249. if c == 0: e = '<?xml version="1.0"?>'
  250. elif c == 1: e = '<trace>'
  251. c += 1
  252. e = e + "\n"
  253. self.assertTrue(e == l)
  254. def test_startTracers(self):
  255. tracer = StubTracers()
  256. tracer.verbose = False
  257. tracer.xml = False
  258. tracer.vcd = False
  259. tracer.startTracers()
  260. self.assertTrue(tracer.called.count("initXML") == 0)
  261. self.assertTrue(tracer.called.count("initVCD") == 0)
  262. tracer = StubTracers()
  263. tracer.verbose = True
  264. tracer.xml = True
  265. tracer.vcd = True
  266. tracer.startTracers()
  267. self.assertTrue(tracer.called.count("initXML") == 1)
  268. self.assertTrue(tracer.called.count("initVCD") == 1)
  269. tracer = StubTracers()
  270. tracer.verbose = True
  271. tracer.xml = False
  272. tracer.vcd = False
  273. tracer.startTracers()
  274. self.assertTrue(tracer.called.count("initXML") == 0)
  275. self.assertTrue(tracer.called.count("initVCD") == 0)
  276. tracer = StubTracers()
  277. tracer.verbose = False
  278. tracer.xml = True
  279. tracer.vcd = False
  280. tracer.startTracers()
  281. self.assertTrue(tracer.called.count("initXML") == 1)
  282. self.assertTrue(tracer.called.count("initVCD") == 0)
  283. tracer = StubTracers()
  284. tracer.verbose = False
  285. tracer.xml = False
  286. tracer.vcd = True
  287. tracer.startTracers()
  288. self.assertTrue(tracer.called.count("initXML") == 0)
  289. self.assertTrue(tracer.called.count("initVCD") == 1)
  290. def test_stopTracers(self):
  291. class CheckFlush(object):
  292. def __init__(self):
  293. self.flushed = False
  294. def flush(self):
  295. self.flushed = True
  296. def write(self, text):
  297. pass
  298. # Just provide some coverage and check that all files get flushed
  299. tracer = Tracers()
  300. tracer.verbose = False
  301. tracer.xml = False
  302. tracer.vcd = False
  303. tracer.verb_file = CheckFlush()
  304. tracer.xml_file = CheckFlush()
  305. tracer.vcd_file = CheckFlush()
  306. tracer.stopTracers()
  307. self.assertTrue(tracer.verb_file.flushed == False)
  308. self.assertTrue(tracer.xml_file.flushed == False)
  309. self.assertTrue(tracer.vcd_file.flushed == False)
  310. tracer = Tracers()
  311. tracer.verbose = True
  312. tracer.xml = False
  313. tracer.vcd = False
  314. tracer.verb_file = CheckFlush()
  315. tracer.xml_file = CheckFlush()
  316. tracer.vcd_file = CheckFlush()
  317. tracer.stopTracers()
  318. self.assertTrue(tracer.verb_file.flushed == True)
  319. self.assertTrue(tracer.xml_file.flushed == False)
  320. self.assertTrue(tracer.vcd_file.flushed == False)
  321. tracer = Tracers()
  322. tracer.verbose = False
  323. tracer.xml = True
  324. tracer.vcd = False
  325. tracer.verb_file = CheckFlush()
  326. tracer.xml_file = CheckFlush()
  327. tracer.vcd_file = CheckFlush()
  328. tracer.stopTracers()
  329. self.assertTrue(tracer.verb_file.flushed == False)
  330. self.assertTrue(tracer.xml_file.flushed == True)
  331. self.assertTrue(tracer.vcd_file.flushed == False)
  332. tracer = Tracers()
  333. tracer.verbose = False
  334. tracer.xml = False
  335. tracer.vcd = True
  336. tracer.verb_file = CheckFlush()
  337. tracer.xml_file = CheckFlush()
  338. tracer.vcd_file = CheckFlush()
  339. tracer.stopTracers()
  340. self.assertTrue(tracer.verb_file.flushed == False)
  341. self.assertTrue(tracer.xml_file.flushed == False)
  342. self.assertTrue(tracer.vcd_file.flushed == True)
  343. tracer = Tracers()
  344. tracer.verbose = True
  345. tracer.xml = True
  346. tracer.vcd = True
  347. tracer.verb_file = CheckFlush()
  348. tracer.xml_file = CheckFlush()
  349. tracer.vcd_file = CheckFlush()
  350. tracer.stopTracers()
  351. self.assertTrue(tracer.verb_file.flushed == True)
  352. self.assertTrue(tracer.xml_file.flushed == True)
  353. self.assertTrue(tracer.vcd_file.flushed == True)