test_generation.py 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368
  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 os
  18. import sys
  19. import tempfile
  20. import unittest
  21. try:
  22. from generation import PlacementRule
  23. except ImportError:
  24. sys.path.append('../')
  25. from generation import PlacementRule
  26. from generation import GenerationException
  27. from generation import SectionsInfo
  28. from generation import TemplateModel
  29. from generation import GenerationModel
  30. from fragments import FragmentFile
  31. from sdkconfig import SDKConfig
  32. from io import StringIO
  33. class GenerationModelTest(unittest.TestCase):
  34. def setUp(self):
  35. self.model = GenerationModel()
  36. self.sections_info = None
  37. self.script_model = None
  38. with tempfile.NamedTemporaryFile(delete=False) as f:
  39. self.kconfigs_source_file = os.path.join(tempfile.gettempdir(), f.name)
  40. self.addCleanup(os.remove, self.kconfigs_source_file)
  41. with tempfile.NamedTemporaryFile(delete=False) as f:
  42. self.kconfig_projbuilds_source_file = os.path.join(tempfile.gettempdir(), f.name)
  43. self.addCleanup(os.remove, self.kconfig_projbuilds_source_file)
  44. os.environ['COMPONENT_KCONFIGS_SOURCE_FILE'] = self.kconfigs_source_file
  45. os.environ['COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE'] = self.kconfig_projbuilds_source_file
  46. os.environ['COMPONENT_KCONFIGS'] = ''
  47. os.environ['COMPONENT_KCONFIGS_PROJBUILD'] = ''
  48. self.sdkconfig = SDKConfig("data/Kconfig", "data/sdkconfig")
  49. with open("data/sample.lf") as fragment_file_obj:
  50. fragment_file = FragmentFile(fragment_file_obj, self.sdkconfig)
  51. self.model.add_fragments_from_file(fragment_file)
  52. self.sections_info = SectionsInfo()
  53. with open("data/sections.info") as sections_info_file_obj:
  54. self.sections_info.add_sections_info(sections_info_file_obj)
  55. with open("data/template.ld") as template_file_obj:
  56. self.script_model = TemplateModel(template_file_obj)
  57. @staticmethod
  58. def create_fragment_file(contents, name="test_fragment.lf"):
  59. f = StringIO(contents)
  60. f.name = name
  61. return f
  62. def add_fragments(self, text):
  63. fragment_file = self.create_fragment_file(text)
  64. fragment_file = FragmentFile(fragment_file, self.sdkconfig)
  65. self.model.add_fragments_from_file(fragment_file)
  66. def write(self, expected, actual):
  67. self.script_model.fill(expected)
  68. self.script_model.write(open("expected.ld", "w"))
  69. self.script_model.fill(actual)
  70. self.script_model.write(open("actual.ld", "w"))
  71. def generate_default_rules(self):
  72. rules = dict()
  73. # flash_text
  74. placement_rules = list()
  75. rule = PlacementRule(None, None, None, self.model.sections["text"].entries, "flash_text")
  76. placement_rules.append(rule)
  77. rules["flash_text"] = placement_rules
  78. # flash_rodata
  79. placement_rules = list()
  80. rule = PlacementRule(None, None, None, self.model.sections["rodata"].entries, "flash_rodata")
  81. placement_rules.append(rule)
  82. rules["flash_rodata"] = placement_rules
  83. # dram0_data
  84. placement_rules = list()
  85. rule = PlacementRule(None, None, None, self.model.sections["data"].entries | self.model.sections["dram"].entries, "dram0_data")
  86. placement_rules.append(rule)
  87. rules["dram0_data"] = placement_rules
  88. # dram0_bss
  89. placement_rules = list()
  90. rule = PlacementRule(None, None, None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "dram0_bss")
  91. placement_rules.append(rule)
  92. rules["dram0_bss"] = placement_rules
  93. # iram0_text
  94. placement_rules = list()
  95. rule = PlacementRule(None, None, None, self.model.sections["iram"].entries, "iram0_text")
  96. placement_rules.append(rule)
  97. rules["iram0_text"] = placement_rules
  98. # rtc_text
  99. placement_rules = list()
  100. rule = PlacementRule(None, None, None, self.model.sections["rtc_text"].entries, "rtc_text")
  101. placement_rules.append(rule)
  102. rules["rtc_text"] = placement_rules
  103. # rtc_data
  104. placement_rules = list()
  105. rule = PlacementRule(None, None, None, self.model.sections["rtc_data"].entries | self.model.sections["rtc_rodata"].entries, "rtc_data")
  106. placement_rules.append(rule)
  107. rules["rtc_data"] = placement_rules
  108. # rtc_bss
  109. placement_rules = list()
  110. rule = PlacementRule(None, None, None, self.model.sections["rtc_bss"].entries, "rtc_bss")
  111. placement_rules.append(rule)
  112. rules["rtc_bss"] = placement_rules
  113. return rules
  114. def compare_rules(self, expected, actual):
  115. self.assertEqual(set(expected.keys()), set(actual.keys()))
  116. for (target, rules) in actual.items():
  117. message = "target: " + target
  118. actual_target_rules = rules
  119. expected_target_rules = expected[target]
  120. self.assertEqual(len(actual_target_rules), len(expected_target_rules))
  121. for actual_target_rule in actual_target_rules:
  122. self.assertTrue(actual_target_rule in expected_target_rules, message + str(actual_target_rule))
  123. for expected_target_rule in expected_target_rules:
  124. self.assertTrue(expected_target_rule in actual_target_rules, message + str(expected_target_rule))
  125. def get_default(self, target, rules):
  126. return rules[target][0]
  127. def test_rule_generation_default(self):
  128. normal = u"""
  129. [mapping:test]
  130. archive: libfreertos.a
  131. entries:
  132. * (default)
  133. """
  134. self.add_fragments(normal)
  135. actual = self.model.generate_rules(self.sections_info)
  136. expected = self.generate_default_rules()
  137. self.compare_rules(expected, actual)
  138. def test_rule_generation_nominal_1(self):
  139. normal = u"""
  140. [mapping:test]
  141. archive: libfreertos.a
  142. entries:
  143. * (noflash)
  144. """
  145. self.add_fragments(normal)
  146. actual = self.model.generate_rules(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 = u"""
  161. [mapping:test]
  162. archive: libfreertos.a
  163. entries:
  164. timers (rtc)
  165. """
  166. self.add_fragments(normal)
  167. actual = self.model.generate_rules(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 = u"""
  188. [mapping:test]
  189. archive: libfreertos.a
  190. entries:
  191. timers (rtc)
  192. * (noflash)
  193. """
  194. self.add_fragments(normal)
  195. actual = self.model.generate_rules(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 = u"""
  222. [mapping:test]
  223. archive: libfreertos.a
  224. entries:
  225. croutine (rtc)
  226. event_groups (noflash)
  227. timers (rtc)
  228. """
  229. self.add_fragments(normal)
  230. actual = self.model.generate_rules(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 = u"""
  267. [mapping:test]
  268. archive: libfreertos.a
  269. entries:
  270. croutine (rtc)
  271. event_groups (noflash)
  272. timers (rtc)
  273. * (noflash)
  274. """
  275. self.add_fragments(normal)
  276. actual = self.model.generate_rules(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 = u"""
  319. [mapping:test]
  320. archive: libfreertos.a
  321. entries:
  322. croutine:prvCheckPendingReadyList (noflash)
  323. """
  324. self.add_fragments(normal)
  325. actual = self.model.generate_rules(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 = u"""
  346. [mapping:test]
  347. archive: libfreertos.a
  348. entries:
  349. croutine:prvCheckPendingReadyList (noflash)
  350. croutine:prvCheckDelayedList (noflash)
  351. croutine:xCoRoutineCreate (noflash)
  352. """
  353. self.add_fragments(normal)
  354. actual = self.model.generate_rules(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 = u"""
  387. [mapping:test]
  388. archive: libfreertos.a
  389. entries:
  390. croutine:prvCheckPendingReadyList (noflash)
  391. croutine:prvCheckDelayedList (rtc)
  392. croutine:xCoRoutineCreate (noflash)
  393. """
  394. self.add_fragments(normal)
  395. actual = self.model.generate_rules(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 = u"""
  442. [mapping:test]
  443. archive: libfreertos.a
  444. entries:
  445. croutine:prvCheckDelayedList (rtc)
  446. croutine (noflash)
  447. """
  448. self.add_fragments(normal)
  449. actual = self.model.generate_rules(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 = u"""
  484. [mapping:test]
  485. archive: libfreertos.a
  486. entries:
  487. croutine:prvCheckDelayedList (rtc)
  488. * (noflash)
  489. """
  490. self.add_fragments(normal)
  491. actual = self.model.generate_rules(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 = u"""
  531. [mapping:test]
  532. archive: libfreertos.a
  533. entries:
  534. croutine:prvCheckDelayedList (noflash)
  535. croutine (rtc)
  536. * (noflash)
  537. """
  538. self.add_fragments(normal)
  539. actual = self.model.generate_rules(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 = u"""
  574. [mapping:test]
  575. archive: libfreertos.a
  576. entries:
  577. croutine:prvCheckDelayedList (rtc)
  578. croutine (noflash)
  579. * (rtc)
  580. """
  581. self.add_fragments(normal)
  582. actual = self.model.generate_rules(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 = u"""
  627. [mapping:test]
  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_fragments(normal)
  637. actual = self.model.generate_rules(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 = u"""
  688. [mapping:test]
  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_fragments(normal)
  697. actual = self.model.generate_rules(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 = u"""
  748. [mapping:test]
  749. archive: libfreertos.a
  750. entries:
  751. croutine (noflash_data)
  752. croutine (noflash_text)
  753. """
  754. self.add_fragments(normal)
  755. actual = self.model.generate_rules(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 = u"""
  770. [mapping:test]
  771. archive: libfreertos.a
  772. entries:
  773. croutine (noflash_data)
  774. croutine (noflash)
  775. """
  776. self.add_fragments(normal)
  777. actual = self.model.generate_rules(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 = u"""
  792. [mapping:test]
  793. archive: libfreertos.a
  794. entries:
  795. croutine (conflict)
  796. croutine (noflash)
  797. [scheme:conflict]
  798. entries:
  799. rodata -> dram0_data
  800. bss -> dram0_data
  801. """
  802. self.add_fragments(conflict_mapping)
  803. with self.assertRaises(GenerationException):
  804. self.model.generate_rules(self.sections_info)
  805. def test_rule_generation_condition(self):
  806. generation_with_condition = u"""
  807. [mapping:test]
  808. archive: lib.a
  809. entries:
  810. if PERFORMANCE_LEVEL = 1:
  811. obj1 (noflash)
  812. elif PERFORMANCE_LEVEL = 2:
  813. obj1 (noflash)
  814. obj2 (noflash)
  815. elif PERFORMANCE_LEVEL = 3:
  816. obj1 (noflash)
  817. obj2 (noflash)
  818. obj3 (noflash)
  819. else: # PERFORMANCE_LEVEL = 0
  820. * (default)
  821. """
  822. for perf_level in range(0, 4):
  823. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  824. self.model.mappings = {}
  825. self.add_fragments(generation_with_condition)
  826. actual = self.model.generate_rules(self.sections_info)
  827. expected = self.generate_default_rules()
  828. if perf_level < 4:
  829. for append_no in range(1, perf_level + 1):
  830. flash_text_default = self.get_default("flash_text", expected)
  831. flash_rodata_default = self.get_default("flash_rodata", expected)
  832. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  833. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  834. flash_text_default.add_exclusion(iram_rule)
  835. flash_rodata_default.add_exclusion(dram_rule)
  836. expected["iram0_text"].append(iram_rule)
  837. expected["dram0_data"].append(dram_rule)
  838. self.compare_rules(expected, actual)
  839. def test_rule_generation_empty_entries(self):
  840. normal = u"""
  841. [mapping:test]
  842. archive: lib.a
  843. entries:
  844. if PERFORMANCE_LEVEL >= 1: # is false, generate no special rules
  845. obj.a (noflash)
  846. """
  847. self.add_fragments(normal)
  848. actual = self.model.generate_rules(self.sections_info)
  849. expected = self.generate_default_rules() # only default rules
  850. self.compare_rules(expected, actual)
  851. def test_conditional_sections_1(self):
  852. generation_with_condition = u"""
  853. [sections:cond_text_data]
  854. entries:
  855. if PERFORMANCE_LEVEL >= 1:
  856. .text+
  857. .literal+
  858. else:
  859. .data+
  860. [scheme:cond_noflash]
  861. entries:
  862. if PERFORMANCE_LEVEL >= 1:
  863. cond_text_data -> iram0_text
  864. else:
  865. cond_text_data -> dram0_data
  866. [mapping:test]
  867. archive: lib.a
  868. entries:
  869. * (cond_noflash)
  870. """
  871. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value("1")
  872. self.add_fragments(generation_with_condition)
  873. actual = self.model.generate_rules(self.sections_info)
  874. expected = self.generate_default_rules()
  875. flash_text_default = self.get_default("flash_text", expected)
  876. iram0_text_E1 = PlacementRule("lib.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  877. # Add the exclusions
  878. flash_text_default.add_exclusion(iram0_text_E1)
  879. # Add to the placement rules list
  880. expected["iram0_text"].append(iram0_text_E1)
  881. self.compare_rules(expected, actual)
  882. def test_conditional_sections_2(self):
  883. generation_with_condition = u"""
  884. [sections:cond_text_data]
  885. entries:
  886. if PERFORMANCE_LEVEL >= 1:
  887. .text+
  888. .literal+
  889. else:
  890. .rodata+
  891. [scheme:cond_noflash]
  892. entries:
  893. if PERFORMANCE_LEVEL >= 1:
  894. cond_text_data -> iram0_text
  895. else:
  896. cond_text_data -> dram0_data
  897. [mapping:test]
  898. archive: lib.a
  899. entries:
  900. * (cond_noflash)
  901. """
  902. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value("0")
  903. self.add_fragments(generation_with_condition)
  904. actual = self.model.generate_rules(self.sections_info)
  905. expected = self.generate_default_rules()
  906. flash_rodata_default = self.get_default("flash_rodata", expected)
  907. dram0_data_E1 = PlacementRule("lib.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  908. # Add the exclusions
  909. flash_rodata_default.add_exclusion(dram0_data_E1)
  910. # Add to the placement rules list
  911. expected["dram0_data"].append(dram0_data_E1)
  912. self.compare_rules(expected, actual)
  913. def test_rule_generation_condition_with_deprecated_mapping(self):
  914. generation_with_condition = u"""
  915. [mapping]
  916. archive: lib.a
  917. entries:
  918. : PERFORMANCE_LEVEL = 0
  919. : PERFORMANCE_LEVEL = 1
  920. obj1 (noflash)
  921. : PERFORMANCE_LEVEL = 2
  922. obj1 (noflash)
  923. obj2 (noflash)
  924. : PERFORMANCE_LEVEL = 3
  925. obj1 (noflash)
  926. obj2 (noflash)
  927. obj3 (noflash)
  928. """
  929. for perf_level in range(0, 4):
  930. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  931. self.model.mappings = {}
  932. self.add_fragments(generation_with_condition)
  933. actual = self.model.generate_rules(self.sections_info)
  934. expected = self.generate_default_rules()
  935. if perf_level < 4:
  936. for append_no in range(1, perf_level + 1):
  937. flash_text_default = self.get_default("flash_text", expected)
  938. flash_rodata_default = self.get_default("flash_rodata", expected)
  939. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  940. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  941. flash_text_default.add_exclusion(iram_rule)
  942. flash_rodata_default.add_exclusion(dram_rule)
  943. expected["iram0_text"].append(iram_rule)
  944. expected["dram0_data"].append(dram_rule)
  945. self.compare_rules(expected, actual)
  946. def test_rule_generation_multiple_deprecated_mapping_definitions(self):
  947. multiple_deprecated_definitions = u"""
  948. [mapping]
  949. archive: lib.a
  950. entries:
  951. : PERFORMANCE_LEVEL = 0
  952. : PERFORMANCE_LEVEL = 1
  953. obj1 (noflash)
  954. : PERFORMANCE_LEVEL = 2
  955. obj1 (noflash)
  956. : PERFORMANCE_LEVEL = 3
  957. obj1 (noflash)
  958. [mapping]
  959. archive: lib.a
  960. entries:
  961. : PERFORMANCE_LEVEL = 1
  962. obj1 (noflash) # ignore duplicate definition
  963. : PERFORMANCE_LEVEL = 2
  964. obj2 (noflash)
  965. : PERFORMANCE_LEVEL = 3
  966. obj2 (noflash)
  967. obj3 (noflash)
  968. """
  969. for perf_level in range(0, 4):
  970. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  971. self.model.mappings = {}
  972. self.add_fragments(multiple_deprecated_definitions)
  973. actual = self.model.generate_rules(self.sections_info)
  974. expected = self.generate_default_rules()
  975. if perf_level < 4:
  976. for append_no in range(1, perf_level + 1):
  977. flash_text_default = self.get_default("flash_text", expected)
  978. flash_rodata_default = self.get_default("flash_rodata", expected)
  979. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  980. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  981. flash_text_default.add_exclusion(iram_rule)
  982. flash_rodata_default.add_exclusion(dram_rule)
  983. expected["iram0_text"].append(iram_rule)
  984. expected["dram0_data"].append(dram_rule)
  985. self.compare_rules(expected, actual)
  986. def test_rule_generation_multiple_mapping_definitions(self):
  987. multiple_deprecated_definitions = u"""
  988. [mapping:base]
  989. archive: lib.a
  990. entries:
  991. if PERFORMANCE_LEVEL = 1:
  992. obj1 (noflash)
  993. elif PERFORMANCE_LEVEL = 2:
  994. obj1 (noflash)
  995. elif PERFORMANCE_LEVEL = 3:
  996. obj1 (noflash)
  997. else:
  998. * (default)
  999. [mapping:extra]
  1000. archive: lib.a
  1001. entries:
  1002. if PERFORMANCE_LEVEL = 1:
  1003. obj1 (noflash) # ignore duplicate definition
  1004. elif PERFORMANCE_LEVEL = 2:
  1005. obj2 (noflash)
  1006. elif PERFORMANCE_LEVEL = 3:
  1007. obj2 (noflash)
  1008. obj3 (noflash)
  1009. else:
  1010. * (default)
  1011. """
  1012. for perf_level in range(0, 4):
  1013. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  1014. self.model.mappings = {}
  1015. self.add_fragments(multiple_deprecated_definitions)
  1016. actual = self.model.generate_rules(self.sections_info)
  1017. expected = self.generate_default_rules()
  1018. if perf_level < 4:
  1019. for append_no in range(1, perf_level + 1):
  1020. flash_text_default = self.get_default("flash_text", expected)
  1021. flash_rodata_default = self.get_default("flash_rodata", expected)
  1022. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  1023. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  1024. flash_text_default.add_exclusion(iram_rule)
  1025. flash_rodata_default.add_exclusion(dram_rule)
  1026. expected["iram0_text"].append(iram_rule)
  1027. expected["dram0_data"].append(dram_rule)
  1028. self.compare_rules(expected, actual)
  1029. if __name__ == "__main__":
  1030. unittest.main()