test_generation.py 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125
  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. self.model.mappings[fragment[0].name] = fragment[0]
  54. def _add_sections(self, text):
  55. parser = Sections.get_fragment_grammar()
  56. fragment = parser.parseString(text, parseAll=True)
  57. self.model.sections[fragment[0].name] = fragment[0]
  58. def _add_scheme(self, text):
  59. parser = Scheme.get_fragment_grammar()
  60. fragment = parser.parseString(text, parseAll=True)
  61. self.model.schemes[fragment[0].name] = fragment[0]
  62. def _write(self, expected, actual):
  63. self.script_model.fill(expected, self.sdkconfig)
  64. self.script_model.write(open("expected.ld", "w"))
  65. self.script_model.fill(actual, self.sdkconfig)
  66. self.script_model.write(open("actual.ld", "w"))
  67. def _generate_default_rules(self):
  68. rules = dict()
  69. # flash_text
  70. placement_rules = list()
  71. rule = PlacementRule(None, None, None, self.model.sections["text"].entries, "flash_text")
  72. placement_rules.append(rule)
  73. rules["flash_text"] = placement_rules
  74. # flash_rodata
  75. placement_rules = list()
  76. rule = PlacementRule(None, None, None, self.model.sections["rodata"].entries, "flash_rodata")
  77. placement_rules.append(rule)
  78. rules["flash_rodata"] = placement_rules
  79. # dram0_data
  80. placement_rules = list()
  81. rule = PlacementRule(None, None, None, self.model.sections["data"].entries + self.model.sections["dram"].entries, "dram0_data")
  82. placement_rules.append(rule)
  83. rules["dram0_data"] = placement_rules
  84. # dram0_bss
  85. placement_rules = list()
  86. rule = PlacementRule(None, None, None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "dram0_bss")
  87. placement_rules.append(rule)
  88. rules["dram0_bss"] = placement_rules
  89. # iram0_text
  90. placement_rules = list()
  91. rule = PlacementRule(None, None, None, self.model.sections["iram"].entries, "iram0_text")
  92. placement_rules.append(rule)
  93. rules["iram0_text"] = placement_rules
  94. # rtc_text
  95. placement_rules = list()
  96. rule = PlacementRule(None, None, None, self.model.sections["rtc_text"].entries, "rtc_text")
  97. placement_rules.append(rule)
  98. rules["rtc_text"] = placement_rules
  99. # rtc_data
  100. placement_rules = list()
  101. rule = PlacementRule(None, None, None, self.model.sections["rtc_data"].entries + self.model.sections["rtc_rodata"].entries, "rtc_data")
  102. placement_rules.append(rule)
  103. rules["rtc_data"] = placement_rules
  104. # rtc_bss
  105. placement_rules = list()
  106. rule = PlacementRule(None, None, None, self.model.sections["rtc_bss"].entries, "rtc_bss")
  107. placement_rules.append(rule)
  108. rules["rtc_bss"] = placement_rules
  109. return rules
  110. def _compare_rules(self, expected, actual):
  111. self.assertEqual(set(expected.keys()), set(actual.keys()))
  112. for (target, rules) in actual.items():
  113. message = "target: " + target
  114. actual_target_rules = rules
  115. expected_target_rules = expected[target]
  116. self.assertEqual(len(actual_target_rules), len(expected_target_rules))
  117. for actual_target_rule in actual_target_rules:
  118. self.assertTrue(actual_target_rule in expected_target_rules, message + str(actual_target_rule))
  119. for expected_target_rule in expected_target_rules:
  120. self.assertTrue(expected_target_rule in actual_target_rules, message + str(expected_target_rule))
  121. def _get_default(self, target, rules):
  122. return rules[target][0]
  123. def test_rule_generation_blank(self):
  124. normal = """
  125. [mapping]
  126. archive: libfreertos.a
  127. entries:
  128. """
  129. self._add_mapping(normal)
  130. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  131. expected = self._generate_default_rules()
  132. self.assertEqual(expected, actual)
  133. def test_rule_generation_nominal_1(self):
  134. normal = """
  135. [mapping]
  136. archive: libfreertos.a
  137. entries:
  138. * (noflash)
  139. """
  140. self._add_mapping(normal)
  141. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  142. expected = self._generate_default_rules()
  143. flash_text_default = self._get_default("flash_text", expected)
  144. flash_rodata_default = self._get_default("flash_rodata", expected)
  145. iram0_text_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  146. dram0_data_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  147. # Add the exclusions
  148. flash_text_default.add_exclusion(iram0_text_E1)
  149. flash_rodata_default.add_exclusion(dram0_data_E1)
  150. # Add to the placement rules list
  151. expected["iram0_text"].append(iram0_text_E1)
  152. expected["dram0_data"].append(dram0_data_E1)
  153. self._compare_rules(expected, actual)
  154. def test_rule_generation_nominal_2(self):
  155. normal = """
  156. [mapping]
  157. archive: libfreertos.a
  158. entries:
  159. timers (rtc)
  160. """
  161. self._add_mapping(normal)
  162. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  163. expected = self._generate_default_rules()
  164. flash_text_default = self._get_default("flash_text", expected)
  165. flash_rodata_default = self._get_default("flash_rodata", expected)
  166. dram0_data_default = self._get_default("dram0_data", expected)
  167. dram0_bss_default = self._get_default("dram0_bss", expected)
  168. rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  169. rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  170. rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  171. # Add the exclusions
  172. flash_text_default.add_exclusion(rtc_text_E1)
  173. flash_rodata_default.add_exclusion(rtc_data_E1)
  174. dram0_data_default.add_exclusion(rtc_data_E1)
  175. dram0_bss_default.add_exclusion(rtc_bss_E1)
  176. # Add the rules
  177. expected["rtc_text"].append(rtc_text_E1)
  178. expected["rtc_data"].append(rtc_data_E1)
  179. expected["rtc_bss"].append(rtc_bss_E1)
  180. self._compare_rules(expected, actual)
  181. def test_rule_generation_nominal_3(self):
  182. normal = """
  183. [mapping]
  184. archive: libfreertos.a
  185. entries:
  186. timers (rtc)
  187. * (noflash)
  188. """
  189. self._add_mapping(normal)
  190. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  191. expected = self._generate_default_rules()
  192. flash_text_default = self._get_default("flash_text", expected)
  193. flash_rodata_default = self._get_default("flash_rodata", expected)
  194. dram0_data_default = self._get_default("dram0_data", expected)
  195. dram0_bss_default = self._get_default("dram0_bss", expected)
  196. rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  197. rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  198. rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  199. iram0_text_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  200. dram0_data_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  201. # Add the exclusions
  202. flash_text_default.add_exclusion(iram0_text_E2)
  203. flash_rodata_default.add_exclusion(dram0_data_E2)
  204. dram0_data_default.add_exclusion(rtc_data_E1)
  205. dram0_bss_default.add_exclusion(rtc_bss_E1)
  206. iram0_text_E2.add_exclusion(rtc_text_E1)
  207. dram0_data_E2.add_exclusion(rtc_data_E1)
  208. # Add the rules
  209. expected["iram0_text"].append(iram0_text_E2)
  210. expected["dram0_data"].append(dram0_data_E2)
  211. expected["rtc_text"].append(rtc_text_E1)
  212. expected["rtc_data"].append(rtc_data_E1)
  213. expected["rtc_bss"].append(rtc_bss_E1)
  214. self._compare_rules(expected, actual)
  215. def test_rule_generation_nominal_4(self):
  216. normal = """
  217. [mapping]
  218. archive: libfreertos.a
  219. entries:
  220. croutine (rtc)
  221. event_groups (noflash)
  222. timers (rtc)
  223. """
  224. self._add_mapping(normal)
  225. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  226. expected = self._generate_default_rules()
  227. flash_text_default = self._get_default("flash_text", expected)
  228. flash_rodata_default = self._get_default("flash_rodata", expected)
  229. dram0_data_default = self._get_default("dram0_data", expected)
  230. dram0_bss_default = self._get_default("dram0_bss", expected)
  231. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  232. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  233. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  234. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  235. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  236. rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  237. rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  238. rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  239. # Add the exclusions
  240. flash_text_default.add_exclusion(rtc_text_E3)
  241. flash_rodata_default.add_exclusion(rtc_data_E3)
  242. dram0_data_default.add_exclusion(rtc_data_E3)
  243. dram0_bss_default.add_exclusion(rtc_bss_E3)
  244. flash_text_default.add_exclusion(iram0_text_E2)
  245. flash_rodata_default.add_exclusion(dram0_data_E2)
  246. flash_text_default.add_exclusion(rtc_text_E1)
  247. flash_rodata_default.add_exclusion(rtc_data_E1)
  248. dram0_data_default.add_exclusion(rtc_data_E1)
  249. dram0_bss_default.add_exclusion(rtc_bss_E1)
  250. # Add the rules
  251. expected["rtc_text"].append(rtc_text_E3)
  252. expected["rtc_data"].append(rtc_data_E3)
  253. expected["rtc_bss"].append(rtc_bss_E3)
  254. expected["iram0_text"].append(iram0_text_E2)
  255. expected["dram0_data"].append(dram0_data_E2)
  256. expected["rtc_text"].append(rtc_text_E1)
  257. expected["rtc_data"].append(rtc_data_E1)
  258. expected["rtc_bss"].append(rtc_bss_E1)
  259. self._compare_rules(expected, actual)
  260. def test_rule_generation_nominal_5(self):
  261. normal = """
  262. [mapping]
  263. archive: libfreertos.a
  264. entries:
  265. croutine (rtc)
  266. event_groups (noflash)
  267. timers (rtc)
  268. * (noflash)
  269. """
  270. self._add_mapping(normal)
  271. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  272. expected = self._generate_default_rules()
  273. flash_text_default = self._get_default("flash_text", expected)
  274. flash_rodata_default = self._get_default("flash_rodata", expected)
  275. dram0_data_default = self._get_default("dram0_data", expected)
  276. dram0_bss_default = self._get_default("dram0_bss", expected)
  277. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  278. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  279. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  280. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  281. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  282. rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  283. rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  284. rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  285. iram0_text_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  286. dram0_data_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  287. # Add the exclusions
  288. flash_text_default.add_exclusion(iram0_text_E4)
  289. flash_rodata_default.add_exclusion(dram0_data_E4)
  290. iram0_text_E4.add_exclusion(rtc_text_E3)
  291. dram0_data_E4.add_exclusion(rtc_data_E3)
  292. dram0_data_default.add_exclusion(rtc_data_E3)
  293. dram0_bss_default.add_exclusion(rtc_bss_E3)
  294. iram0_text_E4.add_exclusion(iram0_text_E2)
  295. dram0_data_E4.add_exclusion(dram0_data_E2)
  296. iram0_text_E4.add_exclusion(rtc_text_E1)
  297. dram0_data_E4.add_exclusion(rtc_data_E1)
  298. dram0_data_default.add_exclusion(rtc_data_E1)
  299. dram0_bss_default.add_exclusion(rtc_bss_E1)
  300. # Add the rules
  301. expected["iram0_text"].append(iram0_text_E4)
  302. expected["dram0_data"].append(dram0_data_E4)
  303. expected["rtc_text"].append(rtc_text_E3)
  304. expected["rtc_data"].append(rtc_data_E3)
  305. expected["rtc_bss"].append(rtc_bss_E3)
  306. expected["iram0_text"].append(iram0_text_E2)
  307. expected["dram0_data"].append(dram0_data_E2)
  308. expected["rtc_text"].append(rtc_text_E1)
  309. expected["rtc_data"].append(rtc_data_E1)
  310. expected["rtc_bss"].append(rtc_bss_E1)
  311. self._compare_rules(expected, actual)
  312. def test_rule_generation_nominal_6(self):
  313. normal = """
  314. [mapping]
  315. archive: libfreertos.a
  316. entries:
  317. croutine:prvCheckPendingReadyList (noflash)
  318. """
  319. self._add_mapping(normal)
  320. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  321. expected = self._generate_default_rules()
  322. flash_text_default = self._get_default("flash_text", expected)
  323. flash_rodata_default = self._get_default("flash_rodata", expected)
  324. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  325. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  326. iram0_text_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  327. dram0_data_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  328. # Add the exclusions
  329. flash_text_default.add_exclusion(iram0_text_E1_extra, self.sections_info)
  330. flash_rodata_default.add_exclusion(dram0_data_E1_extra, self.sections_info)
  331. iram0_text_E1_extra.add_exclusion(iram0_text_E1, self.sections_info)
  332. dram0_data_E1_extra.add_exclusion(dram0_data_E1, self.sections_info)
  333. # Add the rules
  334. expected["flash_text"].append(iram0_text_E1_extra)
  335. expected["flash_rodata"].append(dram0_data_E1_extra)
  336. expected["iram0_text"].append(iram0_text_E1)
  337. expected["dram0_data"].append(dram0_data_E1)
  338. self._compare_rules(expected, actual)
  339. def test_rule_generation_nominal_7(self):
  340. normal = """
  341. [mapping]
  342. archive: libfreertos.a
  343. entries:
  344. croutine:prvCheckPendingReadyList (noflash)
  345. croutine:prvCheckDelayedList (noflash)
  346. croutine:xCoRoutineCreate (noflash)
  347. """
  348. self._add_mapping(normal)
  349. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  350. expected = self._generate_default_rules()
  351. flash_text_default = self._get_default("flash_text", expected)
  352. flash_rodata_default = self._get_default("flash_rodata", expected)
  353. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  354. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  355. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  356. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  357. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
  358. dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
  359. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  360. flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  361. # Add the exclusions
  362. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  363. flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
  364. flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
  365. flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
  366. flash_text_extra.add_exclusion(iram0_text_E2, self.sections_info)
  367. flash_rodata_extra.add_exclusion(dram0_data_E2, self.sections_info)
  368. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  369. flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
  370. # Add the rules
  371. expected["flash_text"].append(flash_text_extra)
  372. expected["flash_rodata"].append(flash_rodata_extra)
  373. expected["iram0_text"].append(iram0_text_E1)
  374. expected["dram0_data"].append(dram0_data_E1)
  375. expected["iram0_text"].append(iram0_text_E2)
  376. expected["dram0_data"].append(dram0_data_E2)
  377. expected["iram0_text"].append(iram0_text_E3)
  378. expected["dram0_data"].append(dram0_data_E3)
  379. self._compare_rules(expected, actual)
  380. def test_rule_generation_nominal_8(self):
  381. normal = """
  382. [mapping]
  383. archive: libfreertos.a
  384. entries:
  385. croutine:prvCheckPendingReadyList (noflash)
  386. croutine:prvCheckDelayedList (rtc)
  387. croutine:xCoRoutineCreate (noflash)
  388. """
  389. self._add_mapping(normal)
  390. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  391. expected = self._generate_default_rules()
  392. flash_text_default = self._get_default("flash_text", expected)
  393. flash_rodata_default = self._get_default("flash_rodata", expected)
  394. dram0_data_default = self._get_default("dram0_data", expected)
  395. dram0_bss_default = self._get_default("dram0_bss", expected)
  396. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  397. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  398. rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  399. rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  400. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  401. rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  402. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  403. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
  404. dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
  405. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  406. flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  407. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
  408. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  409. # Add the exclusions
  410. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  411. flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
  412. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  413. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  414. flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
  415. flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
  416. flash_text_extra.add_exclusion(rtc_text_E2, self.sections_info)
  417. dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
  418. flash_rodata_extra.add_exclusion(rtc_data_E2, self.sections_info)
  419. dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
  420. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  421. flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
  422. # Add the rules
  423. expected["flash_text"].append(flash_text_extra)
  424. expected["flash_rodata"].append(flash_rodata_extra)
  425. expected["dram0_data"].append(dram0_data_extra)
  426. expected["dram0_bss"].append(dram0_bss_extra)
  427. expected["iram0_text"].append(iram0_text_E1)
  428. expected["dram0_data"].append(dram0_data_E1)
  429. expected["rtc_text"].append(rtc_text_E2)
  430. expected["rtc_data"].append(rtc_data_E2)
  431. expected["rtc_bss"].append(rtc_bss_E2)
  432. expected["iram0_text"].append(iram0_text_E3)
  433. expected["dram0_data"].append(dram0_data_E3)
  434. self._compare_rules(expected, actual)
  435. def test_rule_generation_nominal_9(self):
  436. normal = """
  437. [mapping]
  438. archive: libfreertos.a
  439. entries:
  440. croutine:prvCheckDelayedList (rtc)
  441. croutine (noflash)
  442. """
  443. self._add_mapping(normal)
  444. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  445. expected = self._generate_default_rules()
  446. flash_text_default = self._get_default("flash_text", expected)
  447. flash_rodata_default = self._get_default("flash_rodata", expected)
  448. dram0_data_default = self._get_default("dram0_data", expected)
  449. dram0_bss_default = self._get_default("dram0_bss", expected)
  450. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  451. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  452. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  453. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  454. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  455. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  456. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  457. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
  458. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  459. # Add the exclusions
  460. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  461. flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
  462. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  463. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  464. dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  465. dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  466. iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
  467. dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
  468. # Add the rules
  469. expected["dram0_data"].append(dram0_data_extra)
  470. expected["dram0_bss"].append(dram0_bss_extra)
  471. expected["iram0_text"].append(iram0_text_E2)
  472. expected["dram0_data"].append(dram0_data_E2)
  473. expected["rtc_text"].append(rtc_text_E1)
  474. expected["rtc_data"].append(rtc_data_E1)
  475. expected["rtc_bss"].append(rtc_bss_E1)
  476. self._compare_rules(expected, actual)
  477. def test_rule_generation_nominal_10(self):
  478. normal = """
  479. [mapping]
  480. archive: libfreertos.a
  481. entries:
  482. croutine:prvCheckDelayedList (rtc)
  483. * (noflash)
  484. """
  485. self._add_mapping(normal)
  486. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  487. expected = self._generate_default_rules()
  488. flash_text_default = self._get_default("flash_text", expected)
  489. flash_rodata_default = self._get_default("flash_rodata", expected)
  490. iram0_text_default = self._get_default("iram0_text", expected)
  491. dram0_data_default = self._get_default("dram0_data", expected)
  492. dram0_bss_default = self._get_default("dram0_bss", expected)
  493. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  494. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  495. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  496. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  497. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  498. iram0_text_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  499. dram0_data_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  500. iram0_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "iram0_text")
  501. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*", ".rodata.*"], "dram0_data")
  502. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  503. # Add the exclusions
  504. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  505. flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
  506. iram0_text_default.add_exclusion(iram0_text_extra, self.sections_info)
  507. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  508. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  509. iram0_text_E2.add_exclusion(iram0_text_extra, self.sections_info)
  510. dram0_data_E2.add_exclusion(dram0_data_extra, self.sections_info)
  511. iram0_text_extra.add_exclusion(rtc_text_E1, self.sections_info)
  512. dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  513. dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  514. # Add the rules
  515. expected["iram0_text"].append(iram0_text_extra)
  516. expected["dram0_data"].append(dram0_data_extra)
  517. expected["dram0_bss"].append(dram0_bss_extra)
  518. expected["iram0_text"].append(iram0_text_E2)
  519. expected["dram0_data"].append(dram0_data_E2)
  520. expected["rtc_text"].append(rtc_text_E1)
  521. expected["rtc_data"].append(rtc_data_E1)
  522. expected["rtc_bss"].append(rtc_bss_E1)
  523. self._compare_rules(expected, actual)
  524. def test_rule_generation_nominal_11(self):
  525. normal = """
  526. [mapping]
  527. archive: libfreertos.a
  528. entries:
  529. croutine:prvCheckDelayedList (noflash)
  530. croutine (rtc)
  531. * (noflash)
  532. """
  533. self._add_mapping(normal)
  534. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  535. expected = self._generate_default_rules()
  536. flash_text_default = self._get_default("flash_text", expected)
  537. flash_rodata_default = self._get_default("flash_rodata", expected)
  538. iram0_text_default = self._get_default("iram0_text", expected)
  539. dram0_data_default = self._get_default("dram0_data", expected)
  540. dram0_bss_default = self._get_default("dram0_bss", expected)
  541. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  542. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  543. rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  544. rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  545. rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  546. iram0_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  547. dram0_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  548. # Add the exclusions
  549. flash_text_default.add_exclusion(iram0_text_E3, self.sections_info)
  550. flash_rodata_default.add_exclusion(dram0_data_E3, self.sections_info)
  551. iram0_text_default.add_exclusion(rtc_text_E2, self.sections_info)
  552. dram0_data_default.add_exclusion(rtc_data_E2, self.sections_info)
  553. dram0_bss_default.add_exclusion(rtc_bss_E2, self.sections_info)
  554. iram0_text_E3.add_exclusion(rtc_text_E2, self.sections_info)
  555. dram0_data_E3.add_exclusion(rtc_data_E2, self.sections_info)
  556. rtc_text_E2.add_exclusion(iram0_text_E1, self.sections_info)
  557. rtc_data_E2.add_exclusion(dram0_data_E1, self.sections_info)
  558. # Add the rules
  559. expected["iram0_text"].append(iram0_text_E1)
  560. expected["dram0_data"].append(dram0_data_E1)
  561. expected["rtc_text"].append(rtc_text_E2)
  562. expected["rtc_data"].append(rtc_data_E2)
  563. expected["rtc_bss"].append(rtc_bss_E2)
  564. expected["iram0_text"].append(iram0_text_E3)
  565. expected["dram0_data"].append(dram0_data_E3)
  566. self._compare_rules(expected, actual)
  567. def test_rule_generation_nominal_12(self):
  568. normal = """
  569. [mapping]
  570. archive: libfreertos.a
  571. entries:
  572. croutine:prvCheckDelayedList (rtc)
  573. croutine (noflash)
  574. * (rtc)
  575. """
  576. self._add_mapping(normal)
  577. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  578. expected = self._generate_default_rules()
  579. flash_text_default = self._get_default("flash_text", expected)
  580. flash_rodata_default = self._get_default("flash_rodata", expected)
  581. dram0_data_default = self._get_default("dram0_data", expected)
  582. dram0_bss_default = self._get_default("dram0_bss", expected)
  583. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  584. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  585. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  586. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  587. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  588. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  589. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  590. rtc_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "rtc_text")
  591. rtc_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  592. rtc_bss_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  593. rtc_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "rtc_data")
  594. rtc_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "rtc_bss")
  595. # Add the exclusions
  596. flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
  597. flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
  598. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  599. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  600. rtc_text_E3.add_exclusion(iram0_text_E2, self.sections_info)
  601. rtc_data_E3.add_exclusion(dram0_data_E2, self.sections_info)
  602. rtc_data_E3.add_exclusion(rtc_data_extra, self.sections_info)
  603. rtc_bss_E3.add_exclusion(rtc_bss_extra, self.sections_info)
  604. rtc_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  605. rtc_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  606. iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
  607. dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
  608. # Add the rules
  609. expected["rtc_data"].append(rtc_data_extra)
  610. expected["rtc_bss"].append(rtc_bss_extra)
  611. expected["rtc_text"].append(rtc_text_E1)
  612. expected["rtc_data"].append(rtc_data_E1)
  613. expected["rtc_bss"].append(rtc_bss_E1)
  614. expected["iram0_text"].append(iram0_text_E2)
  615. expected["dram0_data"].append(dram0_data_E2)
  616. expected["rtc_text"].append(rtc_text_E3)
  617. expected["rtc_data"].append(rtc_data_E3)
  618. expected["rtc_bss"].append(rtc_bss_E3)
  619. self._compare_rules(expected, actual)
  620. def test_rule_generation_nominal_13(self):
  621. normal = """
  622. [mapping]
  623. archive: libfreertos.a
  624. entries:
  625. croutine:prvCheckDelayedList (noflash)
  626. event_groups:xEventGroupCreate (noflash)
  627. croutine (rtc)
  628. event_groups (rtc)
  629. * (noflash)
  630. """
  631. self._add_mapping(normal)
  632. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  633. expected = self._generate_default_rules()
  634. flash_text_default = self._get_default("flash_text", expected)
  635. flash_rodata_default = self._get_default("flash_rodata", expected)
  636. dram0_data_default = self._get_default("dram0_data", expected)
  637. dram0_bss_default = self._get_default("dram0_bss", expected)
  638. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  639. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  640. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "iram0_text")
  641. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["rodata"].entries, "dram0_data")
  642. rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  643. rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  644. rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  645. rtc_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "rtc_text")
  646. rtc_data_E4 = PlacementRule("libfreertos.a", "event_groups", None,
  647. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  648. rtc_bss_E4 = PlacementRule("libfreertos.a", "event_groups", None,
  649. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  650. iram0_text_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  651. dram0_data_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  652. # Add the exclusions
  653. flash_text_default.add_exclusion(iram0_text_E5, self.sections_info)
  654. flash_rodata_default.add_exclusion(dram0_data_E5, self.sections_info)
  655. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  656. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  657. dram0_bss_default.add_exclusion(rtc_bss_E4, self.sections_info)
  658. dram0_data_default.add_exclusion(rtc_data_E4, self.sections_info)
  659. iram0_text_E5.add_exclusion(rtc_text_E3, self.sections_info)
  660. dram0_data_E5.add_exclusion(rtc_data_E3, self.sections_info)
  661. iram0_text_E5.add_exclusion(rtc_text_E4, self.sections_info)
  662. dram0_data_E5.add_exclusion(rtc_data_E4, self.sections_info)
  663. rtc_text_E4.add_exclusion(iram0_text_E2, self.sections_info)
  664. rtc_data_E4.add_exclusion(dram0_data_E2, self.sections_info)
  665. rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
  666. rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
  667. # Add the rules
  668. expected["iram0_text"].append(iram0_text_E1)
  669. expected["dram0_data"].append(dram0_data_E1)
  670. expected["iram0_text"].append(iram0_text_E2)
  671. expected["dram0_data"].append(dram0_data_E2)
  672. expected["rtc_text"].append(rtc_text_E3)
  673. expected["rtc_data"].append(rtc_data_E3)
  674. expected["rtc_bss"].append(rtc_bss_E3)
  675. expected["rtc_text"].append(rtc_text_E4)
  676. expected["rtc_data"].append(rtc_data_E4)
  677. expected["rtc_bss"].append(rtc_bss_E4)
  678. expected["iram0_text"].append(iram0_text_E5)
  679. expected["dram0_data"].append(dram0_data_E5)
  680. self._compare_rules(expected, actual)
  681. def test_rule_generation_nominal_14(self):
  682. normal = """
  683. [mapping]
  684. archive: libfreertos.a
  685. entries:
  686. croutine:prvCheckDelayedList (noflash)
  687. event_groups:xEventGroupCreate (rtc)
  688. croutine (rtc)
  689. event_groups (noflash)
  690. """
  691. self._add_mapping(normal)
  692. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  693. expected = self._generate_default_rules()
  694. flash_text_default = self._get_default("flash_text", expected)
  695. flash_rodata_default = self._get_default("flash_rodata", expected)
  696. dram0_data_default = self._get_default("dram0_data", expected)
  697. dram0_bss_default = self._get_default("dram0_bss", expected)
  698. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  699. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  700. rtc_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "rtc_text")
  701. rtc_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
  702. self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  703. rtc_bss_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
  704. self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  705. rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  706. rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries + self.model.sections["rodata"].entries, "rtc_data")
  707. rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries + self.model.sections["common"].entries, "rtc_bss")
  708. iram0_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  709. dram0_data_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  710. dram0_data_extra = PlacementRule("libfreertos.a", "event_groups", None, [".data.*"], "dram0_data")
  711. dram0_bss_extra = PlacementRule("libfreertos.a", "event_groups", None, [".bss.*"], "dram0_bss")
  712. # Add the exclusions
  713. flash_text_default.add_exclusion(iram0_text_E4, self.sections_info)
  714. flash_rodata_default.add_exclusion(dram0_data_E4, self.sections_info)
  715. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  716. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  717. flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
  718. flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
  719. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  720. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  721. iram0_text_E4.add_exclusion(rtc_text_E2, self.sections_info)
  722. dram0_data_E4.add_exclusion(rtc_data_E2, self.sections_info)
  723. dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
  724. dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
  725. rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
  726. rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
  727. # Add the rules
  728. expected["iram0_text"].append(iram0_text_E1)
  729. expected["dram0_data"].append(dram0_data_E1)
  730. expected["rtc_text"].append(rtc_text_E2)
  731. expected["rtc_data"].append(rtc_data_E2)
  732. expected["rtc_bss"].append(rtc_bss_E2)
  733. expected["rtc_text"].append(rtc_text_E3)
  734. expected["rtc_data"].append(rtc_data_E3)
  735. expected["rtc_bss"].append(rtc_bss_E3)
  736. expected["iram0_text"].append(iram0_text_E4)
  737. expected["dram0_data"].append(dram0_data_E4)
  738. expected["dram0_data"].append(dram0_data_extra)
  739. expected["dram0_bss"].append(dram0_bss_extra)
  740. self._compare_rules(expected, actual)
  741. def test_rule_generation_nominal_15(self):
  742. normal = """
  743. [mapping]
  744. archive: libfreertos.a
  745. entries:
  746. croutine (noflash_data)
  747. croutine (noflash_text)
  748. """
  749. self._add_mapping(normal)
  750. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  751. expected = self._generate_default_rules()
  752. flash_text_default = self._get_default("flash_text", expected)
  753. flash_rodata_default = self._get_default("flash_rodata", expected)
  754. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  755. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  756. # Add the exclusions
  757. flash_text_default.add_exclusion(iram0_text_E1)
  758. flash_rodata_default.add_exclusion(dram0_data_E1)
  759. # Add the rules
  760. expected["iram0_text"].append(iram0_text_E1)
  761. expected["dram0_data"].append(dram0_data_E1)
  762. self._compare_rules(expected, actual)
  763. def test_rule_generation_nominal_16(self):
  764. normal = """
  765. [mapping]
  766. archive: libfreertos.a
  767. entries:
  768. croutine (noflash_data)
  769. croutine (noflash)
  770. """
  771. self._add_mapping(normal)
  772. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  773. expected = self._generate_default_rules()
  774. flash_text_default = self._get_default("flash_text", expected)
  775. flash_rodata_default = self._get_default("flash_rodata", expected)
  776. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  777. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  778. # Add the exclusions
  779. flash_text_default.add_exclusion(iram0_text_E1)
  780. flash_rodata_default.add_exclusion(dram0_data_E1)
  781. # Add the rules
  782. expected["iram0_text"].append(iram0_text_E1)
  783. expected["dram0_data"].append(dram0_data_E1)
  784. self._compare_rules(expected, actual)
  785. def test_rule_generation_conflict(self):
  786. conflict_mapping = """
  787. [mapping]
  788. archive: libfreertos.a
  789. entries:
  790. croutine (conflict)
  791. croutine (noflash)
  792. """
  793. conflict_scheme = """
  794. [scheme:conflict]
  795. entries:
  796. rodata -> dram0_data
  797. bss -> dram0_data
  798. """
  799. self._add_scheme(conflict_scheme)
  800. self._add_mapping(conflict_mapping)
  801. with self.assertRaises(GenerationException):
  802. self.model.generate_rules(self.sdkconfig, self.sections_info)
  803. def test_rule_generation_condition(self):
  804. generation_with_condition = """
  805. [mapping]
  806. archive: lib.a
  807. entries:
  808. : PERFORMANCE_LEVEL = 0
  809. : PERFORMANCE_LEVEL = 1
  810. obj1 (noflash)
  811. : PERFORMANCE_LEVEL = 2
  812. obj1 (noflash)
  813. obj2 (noflash)
  814. : PERFORMANCE_LEVEL = 3
  815. obj1 (noflash)
  816. obj2 (noflash)
  817. obj3 (noflash)
  818. """
  819. self._add_mapping(generation_with_condition)
  820. for perf_level in range(0, 4):
  821. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  822. actual = self.model.generate_rules(self.sdkconfig, self.sections_info)
  823. expected = self._generate_default_rules()
  824. flash_text_default = self._get_default("flash_text", expected)
  825. flash_rodata_default = self._get_default("flash_rodata", expected)
  826. if perf_level < 4:
  827. for append_no in range(1, perf_level + 1):
  828. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  829. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  830. flash_text_default.add_exclusion(iram_rule)
  831. flash_rodata_default.add_exclusion(dram_rule)
  832. expected["iram0_text"].append(iram_rule)
  833. expected["dram0_data"].append(dram_rule)
  834. self._compare_rules(expected, actual)
  835. if __name__ == "__main__":
  836. unittest.main()