test_generation.py 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240
  1. #!/usr/bin/env python
  2. #
  3. # Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License");
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. #
  17. import unittest
  18. import sys
  19. try:
  20. from generation import PlacementRule
  21. except ImportError:
  22. sys.path.append('../')
  23. from generation import PlacementRule
  24. from generation import GenerationException
  25. from generation import SectionsInfo
  26. from generation import TemplateModel
  27. from generation import GenerationModel
  28. from fragments import FragmentFileModel
  29. from fragments import Mapping
  30. from fragments import Sections
  31. from fragments import Scheme
  32. from sdkconfig import SDKConfig
  33. class GenerationModelTest(unittest.TestCase):
  34. def setUp(self):
  35. self.model = GenerationModel()
  36. self.sdkconfig = None
  37. self.sections_info = None
  38. self.script_model = None
  39. with open("data/Kconfig") as kconfig_file_obj:
  40. with open("data/sdkconfig") as sdkconfig_file_obj:
  41. self.sdkconfig = SDKConfig(kconfig_file_obj, sdkconfig_file_obj)
  42. with open("data/sample.lf") as fragment_file_obj:
  43. fragment_file = FragmentFileModel(fragment_file_obj)
  44. self.model.add_fragments_from_file(fragment_file)
  45. self.sections_info = SectionsInfo()
  46. with open("data/sections.info") as sections_info_file_obj:
  47. self.sections_info.add_sections_info(sections_info_file_obj)
  48. with open("data/template.ld") as template_file_obj:
  49. self.script_model = TemplateModel(template_file_obj)
  50. def _add_mapping(self, text):
  51. parser = Mapping.get_fragment_grammar()
  52. fragment = parser.parseString(text, parseAll=True)
  53. try:
  54. mappings = self.model.mappings[fragment[0].name]
  55. except KeyError:
  56. mappings = list()
  57. self.model.mappings[fragment[0].name] = mappings
  58. mappings.append(fragment[0])
  59. def _add_sections(self, text):
  60. parser = Sections.get_fragment_grammar()
  61. fragment = parser.parseString(text, parseAll=True)
  62. self.model.sections[fragment[0].name] = fragment[0]
  63. def _add_scheme(self, text):
  64. parser = Scheme.get_fragment_grammar()
  65. fragment = parser.parseString(text, parseAll=True)
  66. self.model.schemes[fragment[0].name] = fragment[0]
  67. def _write(self, expected, actual):
  68. self.script_model.fill(expected, self.sdkconfig)
  69. self.script_model.write(open("expected.ld", "w"))
  70. self.script_model.fill(actual, self.sdkconfig)
  71. self.script_model.write(open("actual.ld", "w"))
  72. def _generate_default_rules(self):
  73. rules = dict()
  74. # flash_text
  75. placement_rules = list()
  76. rule = PlacementRule(None, None, None, self.model.sections["text"].entries, "flash_text")
  77. placement_rules.append(rule)
  78. rules["flash_text"] = placement_rules
  79. # flash_rodata
  80. placement_rules = list()
  81. rule = PlacementRule(None, None, None, self.model.sections["rodata"].entries, "flash_rodata")
  82. placement_rules.append(rule)
  83. rules["flash_rodata"] = placement_rules
  84. # dram0_data
  85. placement_rules = list()
  86. rule = PlacementRule(None, None, None, self.model.sections["data"].entries + self.model.sections["dram"].entries, "dram0_data")
  87. placement_rules.append(rule)
  88. rules["dram0_data"] = placement_rules
  89. # dram0_bss
  90. placement_rules = list()
  91. rule = PlacementRule(None, None, None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "dram0_bss")
  92. placement_rules.append(rule)
  93. rules["dram0_bss"] = placement_rules
  94. # iram0_text
  95. placement_rules = list()
  96. rule = PlacementRule(None, None, None, self.model.sections["iram"].entries, "iram0_text")
  97. placement_rules.append(rule)
  98. rules["iram0_text"] = placement_rules
  99. # rtc_text
  100. placement_rules = list()
  101. rule = PlacementRule(None, None, None, self.model.sections["rtc_text"].entries, "rtc_text")
  102. placement_rules.append(rule)
  103. rules["rtc_text"] = placement_rules
  104. # rtc_data
  105. placement_rules = list()
  106. rule = PlacementRule(None, None, None, self.model.sections["rtc_data"].entries + self.model.sections["rtc_rodata"].entries, "rtc_data")
  107. placement_rules.append(rule)
  108. rules["rtc_data"] = placement_rules
  109. # rtc_bss
  110. placement_rules = list()
  111. rule = PlacementRule(None, None, None, self.model.sections["rtc_bss"].entries, "rtc_bss")
  112. placement_rules.append(rule)
  113. rules["rtc_bss"] = placement_rules
  114. return rules
  115. def _compare_rules(self, expected, actual):
  116. self.assertEqual(set(expected.keys()), set(actual.keys()))
  117. for (target, rules) in actual.items():
  118. message = "target: " + target
  119. actual_target_rules = rules
  120. expected_target_rules = expected[target]
  121. self.assertEqual(len(actual_target_rules), len(expected_target_rules))
  122. for actual_target_rule in actual_target_rules:
  123. self.assertTrue(actual_target_rule in expected_target_rules, message + str(actual_target_rule))
  124. for expected_target_rule in expected_target_rules:
  125. self.assertTrue(expected_target_rule in actual_target_rules, message + str(expected_target_rule))
  126. def _get_default(self, target, rules):
  127. return rules[target][0]
  128. def test_rule_generation_blank(self):
  129. normal = """
  130. [mapping]
  131. archive: libfreertos.a
  132. entries:
  133. """
  134. self._add_mapping(normal)
  135. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  136. expected = self._generate_default_rules()
  137. self.assertEqual(expected, actual)
  138. def test_rule_generation_nominal_1(self):
  139. normal = """
  140. [mapping]
  141. archive: libfreertos.a
  142. entries:
  143. * (noflash)
  144. """
  145. self._add_mapping(normal)
  146. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  147. expected = self._generate_default_rules()
  148. flash_text_default = self._get_default("flash_text", expected)
  149. flash_rodata_default = self._get_default("flash_rodata", expected)
  150. iram0_text_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  151. dram0_data_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  152. # Add the exclusions
  153. flash_text_default.add_exclusion(iram0_text_E1)
  154. flash_rodata_default.add_exclusion(dram0_data_E1)
  155. # Add to the placement rules list
  156. expected["iram0_text"].append(iram0_text_E1)
  157. expected["dram0_data"].append(dram0_data_E1)
  158. self._compare_rules(expected, actual)
  159. def test_rule_generation_nominal_2(self):
  160. normal = """
  161. [mapping]
  162. archive: libfreertos.a
  163. entries:
  164. timers (rtc)
  165. """
  166. self._add_mapping(normal)
  167. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  168. expected = self._generate_default_rules()
  169. flash_text_default = self._get_default("flash_text", expected)
  170. flash_rodata_default = self._get_default("flash_rodata", expected)
  171. dram0_data_default = self._get_default("dram0_data", expected)
  172. dram0_bss_default = self._get_default("dram0_bss", expected)
  173. rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  174. rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  175. rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  176. # Add the exclusions
  177. flash_text_default.add_exclusion(rtc_text_E1)
  178. flash_rodata_default.add_exclusion(rtc_data_E1)
  179. dram0_data_default.add_exclusion(rtc_data_E1)
  180. dram0_bss_default.add_exclusion(rtc_bss_E1)
  181. # Add the rules
  182. expected["rtc_text"].append(rtc_text_E1)
  183. expected["rtc_data"].append(rtc_data_E1)
  184. expected["rtc_bss"].append(rtc_bss_E1)
  185. self._compare_rules(expected, actual)
  186. def test_rule_generation_nominal_3(self):
  187. normal = """
  188. [mapping]
  189. archive: libfreertos.a
  190. entries:
  191. timers (rtc)
  192. * (noflash)
  193. """
  194. self._add_mapping(normal)
  195. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  196. expected = self._generate_default_rules()
  197. flash_text_default = self._get_default("flash_text", expected)
  198. flash_rodata_default = self._get_default("flash_rodata", expected)
  199. dram0_data_default = self._get_default("dram0_data", expected)
  200. dram0_bss_default = self._get_default("dram0_bss", expected)
  201. rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  202. rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  203. rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  204. iram0_text_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  205. dram0_data_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  206. # Add the exclusions
  207. flash_text_default.add_exclusion(iram0_text_E2)
  208. flash_rodata_default.add_exclusion(dram0_data_E2)
  209. dram0_data_default.add_exclusion(rtc_data_E1)
  210. dram0_bss_default.add_exclusion(rtc_bss_E1)
  211. iram0_text_E2.add_exclusion(rtc_text_E1)
  212. dram0_data_E2.add_exclusion(rtc_data_E1)
  213. # Add the rules
  214. expected["iram0_text"].append(iram0_text_E2)
  215. expected["dram0_data"].append(dram0_data_E2)
  216. expected["rtc_text"].append(rtc_text_E1)
  217. expected["rtc_data"].append(rtc_data_E1)
  218. expected["rtc_bss"].append(rtc_bss_E1)
  219. self._compare_rules(expected, actual)
  220. def test_rule_generation_nominal_4(self):
  221. normal = """
  222. [mapping]
  223. archive: libfreertos.a
  224. entries:
  225. croutine (rtc)
  226. event_groups (noflash)
  227. timers (rtc)
  228. """
  229. self._add_mapping(normal)
  230. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  231. expected = self._generate_default_rules()
  232. flash_text_default = self._get_default("flash_text", expected)
  233. flash_rodata_default = self._get_default("flash_rodata", expected)
  234. dram0_data_default = self._get_default("dram0_data", expected)
  235. dram0_bss_default = self._get_default("dram0_bss", expected)
  236. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  237. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  238. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  239. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  240. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  241. rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  242. rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  243. rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  244. # Add the exclusions
  245. flash_text_default.add_exclusion(rtc_text_E3)
  246. flash_rodata_default.add_exclusion(rtc_data_E3)
  247. dram0_data_default.add_exclusion(rtc_data_E3)
  248. dram0_bss_default.add_exclusion(rtc_bss_E3)
  249. flash_text_default.add_exclusion(iram0_text_E2)
  250. flash_rodata_default.add_exclusion(dram0_data_E2)
  251. flash_text_default.add_exclusion(rtc_text_E1)
  252. flash_rodata_default.add_exclusion(rtc_data_E1)
  253. dram0_data_default.add_exclusion(rtc_data_E1)
  254. dram0_bss_default.add_exclusion(rtc_bss_E1)
  255. # Add the rules
  256. expected["rtc_text"].append(rtc_text_E3)
  257. expected["rtc_data"].append(rtc_data_E3)
  258. expected["rtc_bss"].append(rtc_bss_E3)
  259. expected["iram0_text"].append(iram0_text_E2)
  260. expected["dram0_data"].append(dram0_data_E2)
  261. expected["rtc_text"].append(rtc_text_E1)
  262. expected["rtc_data"].append(rtc_data_E1)
  263. expected["rtc_bss"].append(rtc_bss_E1)
  264. self._compare_rules(expected, actual)
  265. def test_rule_generation_nominal_5(self):
  266. normal = """
  267. [mapping]
  268. archive: libfreertos.a
  269. entries:
  270. croutine (rtc)
  271. event_groups (noflash)
  272. timers (rtc)
  273. * (noflash)
  274. """
  275. self._add_mapping(normal)
  276. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  277. expected = self._generate_default_rules()
  278. flash_text_default = self._get_default("flash_text", expected)
  279. flash_rodata_default = self._get_default("flash_rodata", expected)
  280. dram0_data_default = self._get_default("dram0_data", expected)
  281. dram0_bss_default = self._get_default("dram0_bss", expected)
  282. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  283. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  284. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  285. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  286. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  287. rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  288. rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  289. rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  290. iram0_text_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  291. dram0_data_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  292. # Add the exclusions
  293. flash_text_default.add_exclusion(iram0_text_E4)
  294. flash_rodata_default.add_exclusion(dram0_data_E4)
  295. iram0_text_E4.add_exclusion(rtc_text_E3)
  296. dram0_data_E4.add_exclusion(rtc_data_E3)
  297. dram0_data_default.add_exclusion(rtc_data_E3)
  298. dram0_bss_default.add_exclusion(rtc_bss_E3)
  299. iram0_text_E4.add_exclusion(iram0_text_E2)
  300. dram0_data_E4.add_exclusion(dram0_data_E2)
  301. iram0_text_E4.add_exclusion(rtc_text_E1)
  302. dram0_data_E4.add_exclusion(rtc_data_E1)
  303. dram0_data_default.add_exclusion(rtc_data_E1)
  304. dram0_bss_default.add_exclusion(rtc_bss_E1)
  305. # Add the rules
  306. expected["iram0_text"].append(iram0_text_E4)
  307. expected["dram0_data"].append(dram0_data_E4)
  308. expected["rtc_text"].append(rtc_text_E3)
  309. expected["rtc_data"].append(rtc_data_E3)
  310. expected["rtc_bss"].append(rtc_bss_E3)
  311. expected["iram0_text"].append(iram0_text_E2)
  312. expected["dram0_data"].append(dram0_data_E2)
  313. expected["rtc_text"].append(rtc_text_E1)
  314. expected["rtc_data"].append(rtc_data_E1)
  315. expected["rtc_bss"].append(rtc_bss_E1)
  316. self._compare_rules(expected, actual)
  317. def test_rule_generation_nominal_6(self):
  318. normal = """
  319. [mapping]
  320. archive: libfreertos.a
  321. entries:
  322. croutine:prvCheckPendingReadyList (noflash)
  323. """
  324. self._add_mapping(normal)
  325. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  326. expected = self._generate_default_rules()
  327. flash_text_default = self._get_default("flash_text", expected)
  328. flash_rodata_default = self._get_default("flash_rodata", expected)
  329. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  330. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  331. iram0_text_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  332. dram0_data_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  333. # Add the exclusions
  334. flash_text_default.add_exclusion(iram0_text_E1_extra, self.sections_info)
  335. flash_rodata_default.add_exclusion(dram0_data_E1_extra, self.sections_info)
  336. iram0_text_E1_extra.add_exclusion(iram0_text_E1, self.sections_info)
  337. dram0_data_E1_extra.add_exclusion(dram0_data_E1, self.sections_info)
  338. # Add the rules
  339. expected["flash_text"].append(iram0_text_E1_extra)
  340. expected["flash_rodata"].append(dram0_data_E1_extra)
  341. expected["iram0_text"].append(iram0_text_E1)
  342. expected["dram0_data"].append(dram0_data_E1)
  343. self._compare_rules(expected, actual)
  344. def test_rule_generation_nominal_7(self):
  345. normal = """
  346. [mapping]
  347. archive: libfreertos.a
  348. entries:
  349. croutine:prvCheckPendingReadyList (noflash)
  350. croutine:prvCheckDelayedList (noflash)
  351. croutine:xCoRoutineCreate (noflash)
  352. """
  353. self._add_mapping(normal)
  354. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  355. expected = self._generate_default_rules()
  356. flash_text_default = self._get_default("flash_text", expected)
  357. flash_rodata_default = self._get_default("flash_rodata", expected)
  358. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  359. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  360. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  361. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  362. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
  363. dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
  364. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  365. flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  366. # Add the exclusions
  367. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  368. flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
  369. flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
  370. flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
  371. flash_text_extra.add_exclusion(iram0_text_E2, self.sections_info)
  372. flash_rodata_extra.add_exclusion(dram0_data_E2, self.sections_info)
  373. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  374. flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
  375. # Add the rules
  376. expected["flash_text"].append(flash_text_extra)
  377. expected["flash_rodata"].append(flash_rodata_extra)
  378. expected["iram0_text"].append(iram0_text_E1)
  379. expected["dram0_data"].append(dram0_data_E1)
  380. expected["iram0_text"].append(iram0_text_E2)
  381. expected["dram0_data"].append(dram0_data_E2)
  382. expected["iram0_text"].append(iram0_text_E3)
  383. expected["dram0_data"].append(dram0_data_E3)
  384. self._compare_rules(expected, actual)
  385. def test_rule_generation_nominal_8(self):
  386. normal = """
  387. [mapping]
  388. archive: libfreertos.a
  389. entries:
  390. croutine:prvCheckPendingReadyList (noflash)
  391. croutine:prvCheckDelayedList (rtc)
  392. croutine:xCoRoutineCreate (noflash)
  393. """
  394. self._add_mapping(normal)
  395. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  396. expected = self._generate_default_rules()
  397. flash_text_default = self._get_default("flash_text", expected)
  398. flash_rodata_default = self._get_default("flash_rodata", expected)
  399. dram0_data_default = self._get_default("dram0_data", expected)
  400. dram0_bss_default = self._get_default("dram0_bss", expected)
  401. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  402. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  403. rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  404. rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  405. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  406. rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  407. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  408. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
  409. dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
  410. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  411. flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  412. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
  413. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  414. # Add the exclusions
  415. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  416. flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
  417. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  418. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  419. flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
  420. flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
  421. flash_text_extra.add_exclusion(rtc_text_E2, self.sections_info)
  422. dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
  423. flash_rodata_extra.add_exclusion(rtc_data_E2, self.sections_info)
  424. dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
  425. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  426. flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
  427. # Add the rules
  428. expected["flash_text"].append(flash_text_extra)
  429. expected["flash_rodata"].append(flash_rodata_extra)
  430. expected["dram0_data"].append(dram0_data_extra)
  431. expected["dram0_bss"].append(dram0_bss_extra)
  432. expected["iram0_text"].append(iram0_text_E1)
  433. expected["dram0_data"].append(dram0_data_E1)
  434. expected["rtc_text"].append(rtc_text_E2)
  435. expected["rtc_data"].append(rtc_data_E2)
  436. expected["rtc_bss"].append(rtc_bss_E2)
  437. expected["iram0_text"].append(iram0_text_E3)
  438. expected["dram0_data"].append(dram0_data_E3)
  439. self._compare_rules(expected, actual)
  440. def test_rule_generation_nominal_9(self):
  441. normal = """
  442. [mapping]
  443. archive: libfreertos.a
  444. entries:
  445. croutine:prvCheckDelayedList (rtc)
  446. croutine (noflash)
  447. """
  448. self._add_mapping(normal)
  449. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  450. expected = self._generate_default_rules()
  451. flash_text_default = self._get_default("flash_text", expected)
  452. flash_rodata_default = self._get_default("flash_rodata", expected)
  453. dram0_data_default = self._get_default("dram0_data", expected)
  454. dram0_bss_default = self._get_default("dram0_bss", expected)
  455. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  456. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  457. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  458. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  459. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  460. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  461. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  462. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
  463. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  464. # Add the exclusions
  465. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  466. flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
  467. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  468. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  469. dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  470. dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  471. iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
  472. dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
  473. # Add the rules
  474. expected["dram0_data"].append(dram0_data_extra)
  475. expected["dram0_bss"].append(dram0_bss_extra)
  476. expected["iram0_text"].append(iram0_text_E2)
  477. expected["dram0_data"].append(dram0_data_E2)
  478. expected["rtc_text"].append(rtc_text_E1)
  479. expected["rtc_data"].append(rtc_data_E1)
  480. expected["rtc_bss"].append(rtc_bss_E1)
  481. self._compare_rules(expected, actual)
  482. def test_rule_generation_nominal_10(self):
  483. normal = """
  484. [mapping]
  485. archive: libfreertos.a
  486. entries:
  487. croutine:prvCheckDelayedList (rtc)
  488. * (noflash)
  489. """
  490. self._add_mapping(normal)
  491. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  492. expected = self._generate_default_rules()
  493. flash_text_default = self._get_default("flash_text", expected)
  494. flash_rodata_default = self._get_default("flash_rodata", expected)
  495. iram0_text_default = self._get_default("iram0_text", expected)
  496. dram0_data_default = self._get_default("dram0_data", expected)
  497. dram0_bss_default = self._get_default("dram0_bss", expected)
  498. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  499. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  500. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  501. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  502. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  503. iram0_text_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  504. dram0_data_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  505. iram0_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "iram0_text")
  506. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*", ".rodata.*"], "dram0_data")
  507. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  508. # Add the exclusions
  509. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  510. flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
  511. iram0_text_default.add_exclusion(iram0_text_extra, self.sections_info)
  512. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  513. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  514. iram0_text_E2.add_exclusion(iram0_text_extra, self.sections_info)
  515. dram0_data_E2.add_exclusion(dram0_data_extra, self.sections_info)
  516. iram0_text_extra.add_exclusion(rtc_text_E1, self.sections_info)
  517. dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  518. dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  519. # Add the rules
  520. expected["iram0_text"].append(iram0_text_extra)
  521. expected["dram0_data"].append(dram0_data_extra)
  522. expected["dram0_bss"].append(dram0_bss_extra)
  523. expected["iram0_text"].append(iram0_text_E2)
  524. expected["dram0_data"].append(dram0_data_E2)
  525. expected["rtc_text"].append(rtc_text_E1)
  526. expected["rtc_data"].append(rtc_data_E1)
  527. expected["rtc_bss"].append(rtc_bss_E1)
  528. self._compare_rules(expected, actual)
  529. def test_rule_generation_nominal_11(self):
  530. normal = """
  531. [mapping]
  532. archive: libfreertos.a
  533. entries:
  534. croutine:prvCheckDelayedList (noflash)
  535. croutine (rtc)
  536. * (noflash)
  537. """
  538. self._add_mapping(normal)
  539. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  540. expected = self._generate_default_rules()
  541. flash_text_default = self._get_default("flash_text", expected)
  542. flash_rodata_default = self._get_default("flash_rodata", expected)
  543. iram0_text_default = self._get_default("iram0_text", expected)
  544. dram0_data_default = self._get_default("dram0_data", expected)
  545. dram0_bss_default = self._get_default("dram0_bss", expected)
  546. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  547. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  548. rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  549. rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  550. rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  551. iram0_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  552. dram0_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  553. # Add the exclusions
  554. flash_text_default.add_exclusion(iram0_text_E3, self.sections_info)
  555. flash_rodata_default.add_exclusion(dram0_data_E3, self.sections_info)
  556. iram0_text_default.add_exclusion(rtc_text_E2, self.sections_info)
  557. dram0_data_default.add_exclusion(rtc_data_E2, self.sections_info)
  558. dram0_bss_default.add_exclusion(rtc_bss_E2, self.sections_info)
  559. iram0_text_E3.add_exclusion(rtc_text_E2, self.sections_info)
  560. dram0_data_E3.add_exclusion(rtc_data_E2, self.sections_info)
  561. rtc_text_E2.add_exclusion(iram0_text_E1, self.sections_info)
  562. rtc_data_E2.add_exclusion(dram0_data_E1, self.sections_info)
  563. # Add the rules
  564. expected["iram0_text"].append(iram0_text_E1)
  565. expected["dram0_data"].append(dram0_data_E1)
  566. expected["rtc_text"].append(rtc_text_E2)
  567. expected["rtc_data"].append(rtc_data_E2)
  568. expected["rtc_bss"].append(rtc_bss_E2)
  569. expected["iram0_text"].append(iram0_text_E3)
  570. expected["dram0_data"].append(dram0_data_E3)
  571. self._compare_rules(expected, actual)
  572. def test_rule_generation_nominal_12(self):
  573. normal = """
  574. [mapping]
  575. archive: libfreertos.a
  576. entries:
  577. croutine:prvCheckDelayedList (rtc)
  578. croutine (noflash)
  579. * (rtc)
  580. """
  581. self._add_mapping(normal)
  582. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  583. expected = self._generate_default_rules()
  584. flash_text_default = self._get_default("flash_text", expected)
  585. flash_rodata_default = self._get_default("flash_rodata", expected)
  586. dram0_data_default = self._get_default("dram0_data", expected)
  587. dram0_bss_default = self._get_default("dram0_bss", expected)
  588. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  589. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  590. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  591. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  592. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  593. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  594. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  595. rtc_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "rtc_text")
  596. rtc_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  597. rtc_bss_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  598. rtc_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "rtc_data")
  599. rtc_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "rtc_bss")
  600. # Add the exclusions
  601. flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
  602. flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
  603. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  604. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  605. rtc_text_E3.add_exclusion(iram0_text_E2, self.sections_info)
  606. rtc_data_E3.add_exclusion(dram0_data_E2, self.sections_info)
  607. rtc_data_E3.add_exclusion(rtc_data_extra, self.sections_info)
  608. rtc_bss_E3.add_exclusion(rtc_bss_extra, self.sections_info)
  609. rtc_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  610. rtc_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  611. iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
  612. dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
  613. # Add the rules
  614. expected["rtc_data"].append(rtc_data_extra)
  615. expected["rtc_bss"].append(rtc_bss_extra)
  616. expected["rtc_text"].append(rtc_text_E1)
  617. expected["rtc_data"].append(rtc_data_E1)
  618. expected["rtc_bss"].append(rtc_bss_E1)
  619. expected["iram0_text"].append(iram0_text_E2)
  620. expected["dram0_data"].append(dram0_data_E2)
  621. expected["rtc_text"].append(rtc_text_E3)
  622. expected["rtc_data"].append(rtc_data_E3)
  623. expected["rtc_bss"].append(rtc_bss_E3)
  624. self._compare_rules(expected, actual)
  625. def test_rule_generation_nominal_13(self):
  626. normal = """
  627. [mapping]
  628. archive: libfreertos.a
  629. entries:
  630. croutine:prvCheckDelayedList (noflash)
  631. event_groups:xEventGroupCreate (noflash)
  632. croutine (rtc)
  633. event_groups (rtc)
  634. * (noflash)
  635. """
  636. self._add_mapping(normal)
  637. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  638. expected = self._generate_default_rules()
  639. flash_text_default = self._get_default("flash_text", expected)
  640. flash_rodata_default = self._get_default("flash_rodata", expected)
  641. dram0_data_default = self._get_default("dram0_data", expected)
  642. dram0_bss_default = self._get_default("dram0_bss", expected)
  643. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  644. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  645. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "iram0_text")
  646. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["rodata"].entries, "dram0_data")
  647. rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  648. rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  649. rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  650. rtc_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "rtc_text")
  651. rtc_data_E4 = PlacementRule("libfreertos.a", "event_groups", None,
  652. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  653. rtc_bss_E4 = PlacementRule("libfreertos.a", "event_groups", None,
  654. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  655. iram0_text_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  656. dram0_data_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  657. # Add the exclusions
  658. flash_text_default.add_exclusion(iram0_text_E5, self.sections_info)
  659. flash_rodata_default.add_exclusion(dram0_data_E5, self.sections_info)
  660. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  661. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  662. dram0_bss_default.add_exclusion(rtc_bss_E4, self.sections_info)
  663. dram0_data_default.add_exclusion(rtc_data_E4, self.sections_info)
  664. iram0_text_E5.add_exclusion(rtc_text_E3, self.sections_info)
  665. dram0_data_E5.add_exclusion(rtc_data_E3, self.sections_info)
  666. iram0_text_E5.add_exclusion(rtc_text_E4, self.sections_info)
  667. dram0_data_E5.add_exclusion(rtc_data_E4, self.sections_info)
  668. rtc_text_E4.add_exclusion(iram0_text_E2, self.sections_info)
  669. rtc_data_E4.add_exclusion(dram0_data_E2, self.sections_info)
  670. rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
  671. rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
  672. # Add the rules
  673. expected["iram0_text"].append(iram0_text_E1)
  674. expected["dram0_data"].append(dram0_data_E1)
  675. expected["iram0_text"].append(iram0_text_E2)
  676. expected["dram0_data"].append(dram0_data_E2)
  677. expected["rtc_text"].append(rtc_text_E3)
  678. expected["rtc_data"].append(rtc_data_E3)
  679. expected["rtc_bss"].append(rtc_bss_E3)
  680. expected["rtc_text"].append(rtc_text_E4)
  681. expected["rtc_data"].append(rtc_data_E4)
  682. expected["rtc_bss"].append(rtc_bss_E4)
  683. expected["iram0_text"].append(iram0_text_E5)
  684. expected["dram0_data"].append(dram0_data_E5)
  685. self._compare_rules(expected, actual)
  686. def test_rule_generation_nominal_14(self):
  687. normal = """
  688. [mapping]
  689. archive: libfreertos.a
  690. entries:
  691. croutine:prvCheckDelayedList (noflash)
  692. event_groups:xEventGroupCreate (rtc)
  693. croutine (rtc)
  694. event_groups (noflash)
  695. """
  696. self._add_mapping(normal)
  697. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  698. expected = self._generate_default_rules()
  699. flash_text_default = self._get_default("flash_text", expected)
  700. flash_rodata_default = self._get_default("flash_rodata", expected)
  701. dram0_data_default = self._get_default("dram0_data", expected)
  702. dram0_bss_default = self._get_default("dram0_bss", expected)
  703. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  704. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  705. rtc_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "rtc_text")
  706. rtc_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
  707. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  708. rtc_bss_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
  709. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  710. rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  711. rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  712. rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  713. iram0_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  714. dram0_data_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  715. dram0_data_extra = PlacementRule("libfreertos.a", "event_groups", None, [".data.*"], "dram0_data")
  716. dram0_bss_extra = PlacementRule("libfreertos.a", "event_groups", None, [".bss.*"], "dram0_bss")
  717. # Add the exclusions
  718. flash_text_default.add_exclusion(iram0_text_E4, self.sections_info)
  719. flash_rodata_default.add_exclusion(dram0_data_E4, self.sections_info)
  720. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  721. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  722. flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
  723. flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
  724. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  725. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  726. iram0_text_E4.add_exclusion(rtc_text_E2, self.sections_info)
  727. dram0_data_E4.add_exclusion(rtc_data_E2, self.sections_info)
  728. dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
  729. dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
  730. rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
  731. rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
  732. # Add the rules
  733. expected["iram0_text"].append(iram0_text_E1)
  734. expected["dram0_data"].append(dram0_data_E1)
  735. expected["rtc_text"].append(rtc_text_E2)
  736. expected["rtc_data"].append(rtc_data_E2)
  737. expected["rtc_bss"].append(rtc_bss_E2)
  738. expected["rtc_text"].append(rtc_text_E3)
  739. expected["rtc_data"].append(rtc_data_E3)
  740. expected["rtc_bss"].append(rtc_bss_E3)
  741. expected["iram0_text"].append(iram0_text_E4)
  742. expected["dram0_data"].append(dram0_data_E4)
  743. expected["dram0_data"].append(dram0_data_extra)
  744. expected["dram0_bss"].append(dram0_bss_extra)
  745. self._compare_rules(expected, actual)
  746. def test_rule_generation_nominal_15(self):
  747. normal = """
  748. [mapping]
  749. archive: libfreertos.a
  750. entries:
  751. croutine (noflash_data)
  752. croutine (noflash_text)
  753. """
  754. self._add_mapping(normal)
  755. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  756. expected = self._generate_default_rules()
  757. flash_text_default = self._get_default("flash_text", expected)
  758. flash_rodata_default = self._get_default("flash_rodata", expected)
  759. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  760. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  761. # Add the exclusions
  762. flash_text_default.add_exclusion(iram0_text_E1)
  763. flash_rodata_default.add_exclusion(dram0_data_E1)
  764. # Add the rules
  765. expected["iram0_text"].append(iram0_text_E1)
  766. expected["dram0_data"].append(dram0_data_E1)
  767. self._compare_rules(expected, actual)
  768. def test_rule_generation_nominal_16(self):
  769. normal = """
  770. [mapping]
  771. archive: libfreertos.a
  772. entries:
  773. croutine (noflash_data)
  774. croutine (noflash)
  775. """
  776. self._add_mapping(normal)
  777. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  778. expected = self._generate_default_rules()
  779. flash_text_default = self._get_default("flash_text", expected)
  780. flash_rodata_default = self._get_default("flash_rodata", expected)
  781. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  782. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  783. # Add the exclusions
  784. flash_text_default.add_exclusion(iram0_text_E1)
  785. flash_rodata_default.add_exclusion(dram0_data_E1)
  786. # Add the rules
  787. expected["iram0_text"].append(iram0_text_E1)
  788. expected["dram0_data"].append(dram0_data_E1)
  789. self._compare_rules(expected, actual)
  790. def test_rule_generation_conflict(self):
  791. conflict_mapping = """
  792. [mapping]
  793. archive: libfreertos.a
  794. entries:
  795. croutine (conflict)
  796. croutine (noflash)
  797. """
  798. conflict_scheme = """
  799. [scheme:conflict]
  800. entries:
  801. rodata -> dram0_data
  802. bss -> dram0_data
  803. """
  804. self._add_scheme(conflict_scheme)
  805. self._add_mapping(conflict_mapping)
  806. with self.assertRaises(GenerationException):
  807. self.model.generate_rules(self.sdkconfig, self.sections_info)
  808. def test_rule_generation_condition(self):
  809. generation_with_condition = """
  810. [mapping]
  811. archive: lib.a
  812. entries:
  813. : PERFORMANCE_LEVEL = 0
  814. : PERFORMANCE_LEVEL = 1
  815. obj1 (noflash)
  816. : PERFORMANCE_LEVEL = 2
  817. obj1 (noflash)
  818. obj2 (noflash)
  819. : PERFORMANCE_LEVEL = 3
  820. obj1 (noflash)
  821. obj2 (noflash)
  822. obj3 (noflash)
  823. """
  824. self._add_mapping(generation_with_condition)
  825. for perf_level in range(0, 4):
  826. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  827. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  828. expected = self._generate_default_rules()
  829. flash_text_default = self._get_default("flash_text", expected)
  830. flash_rodata_default = self._get_default("flash_rodata", expected)
  831. if perf_level < 4:
  832. for append_no in range(1, perf_level + 1):
  833. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  834. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  835. flash_text_default.add_exclusion(iram_rule)
  836. flash_rodata_default.add_exclusion(dram_rule)
  837. expected["iram0_text"].append(iram_rule)
  838. expected["dram0_data"].append(dram_rule)
  839. self._compare_rules(expected, actual)
  840. def test_rule_generation_multiple_mapping_definitions(self):
  841. generation_with_condition1 = """
  842. [mapping]
  843. archive: lib.a
  844. entries:
  845. : PERFORMANCE_LEVEL = 0
  846. : PERFORMANCE_LEVEL = 1
  847. obj1 (noflash)
  848. : PERFORMANCE_LEVEL = 2
  849. obj1 (noflash)
  850. : PERFORMANCE_LEVEL = 3
  851. obj1 (noflash)
  852. """
  853. generation_with_condition2 = """
  854. [mapping]
  855. archive: lib.a
  856. entries:
  857. : PERFORMANCE_LEVEL = 1
  858. obj1 (noflash) # ignore duplicate definition
  859. : PERFORMANCE_LEVEL = 2
  860. obj2 (noflash)
  861. : PERFORMANCE_LEVEL = 3
  862. obj2 (noflash)
  863. obj3 (noflash)
  864. """
  865. self._add_mapping(generation_with_condition1)
  866. self._add_mapping(generation_with_condition2)
  867. for perf_level in range(0, 4):
  868. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  869. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  870. expected = self._generate_default_rules()
  871. flash_text_default = self._get_default("flash_text", expected)
  872. flash_rodata_default = self._get_default("flash_rodata", expected)
  873. if perf_level < 4:
  874. for append_no in range(1, perf_level + 1):
  875. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  876. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  877. flash_text_default.add_exclusion(iram_rule)
  878. flash_rodata_default.add_exclusion(dram_rule)
  879. expected["iram0_text"].append(iram_rule)
  880. expected["dram0_data"].append(dram_rule)
  881. self._compare_rules(expected, actual)
  882. def test_rules_order(self):
  883. # The fragments are structured such that ldgen will:
  884. # - parse freertos2 mapping first
  885. # - entry for prvCheckPendingReadyList is parsed first before prvCheckDelayedList
  886. # We expect that despite this, ldgen will output rules in a set order:
  887. # by increasing specificity and alphabetically
  888. rules_order_mapping_1 = """
  889. [mapping]
  890. archive: libfreertos2.a
  891. entries:
  892. croutine2 (noflash_text)
  893. croutine (noflash_text)
  894. """
  895. rules_order_mapping_2 = """
  896. [mapping]
  897. archive: libfreertos.a
  898. entries:
  899. croutine:prvCheckPendingReadyList (noflash_text)
  900. croutine:prvCheckDelayedList (noflash_text)
  901. """
  902. self._add_mapping(rules_order_mapping_2)
  903. self._add_mapping(rules_order_mapping_1)
  904. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  905. expected = self._generate_default_rules()
  906. flash_text_default = self._get_default("flash_text", expected)
  907. iram0_text_E1 = PlacementRule("libfreertos2.a", "croutine2", None, self.model.sections["text"].entries, "iram0_text")
  908. iram0_text_E2 = PlacementRule("libfreertos2.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  909. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  910. iram0_text_E4 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  911. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  912. # Add the exclusions
  913. flash_text_default.add_exclusion(iram0_text_E1, self.sections_info)
  914. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  915. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  916. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  917. flash_text_extra.add_exclusion(iram0_text_E4, self.sections_info)
  918. # Add the rules, arranged by expected order
  919. expected["flash_text"].append(flash_text_extra)
  920. expected["iram0_text"].append(iram0_text_E4)
  921. expected["iram0_text"].append(iram0_text_E3)
  922. expected["iram0_text"].append(iram0_text_E2)
  923. expected["iram0_text"].append(iram0_text_E1)
  924. # Perform general comparison for all sections
  925. self._compare_rules(expected, actual)
  926. # Perform ordered comparison
  927. self.assertListEqual(actual["flash_text"], expected["flash_text"])
  928. if __name__ == "__main__":
  929. unittest.main()