test_generation.py 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427
  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. # prepare_kconfig_files.py doesn't have to be called because COMPONENT_KCONFIGS and
  49. # COMPONENT_KCONFIGS_PROJBUILD are empty
  50. self.sdkconfig = SDKConfig("data/Kconfig", "data/sdkconfig")
  51. with open("data/sample.lf") as fragment_file_obj:
  52. fragment_file = FragmentFile(fragment_file_obj, self.sdkconfig)
  53. self.model.add_fragments_from_file(fragment_file)
  54. self.sections_info = SectionsInfo()
  55. with open("data/sections.info") as sections_info_file_obj:
  56. self.sections_info.add_sections_info(sections_info_file_obj)
  57. with open("data/template.ld") as template_file_obj:
  58. self.script_model = TemplateModel(template_file_obj)
  59. @staticmethod
  60. def create_fragment_file(contents, name="test_fragment.lf"):
  61. f = StringIO(contents)
  62. f.name = name
  63. return f
  64. def add_fragments(self, text):
  65. fragment_file = self.create_fragment_file(text)
  66. fragment_file = FragmentFile(fragment_file, self.sdkconfig)
  67. self.model.add_fragments_from_file(fragment_file)
  68. def write(self, expected, actual):
  69. self.script_model.fill(expected)
  70. self.script_model.write(open("expected.ld", "w"))
  71. self.script_model.fill(actual)
  72. self.script_model.write(open("actual.ld", "w"))
  73. def generate_default_rules(self):
  74. rules = dict()
  75. # flash_text
  76. placement_rules = list()
  77. rule = PlacementRule(None, None, None, self.model.sections["text"].entries, "flash_text")
  78. placement_rules.append(rule)
  79. rules["flash_text"] = placement_rules
  80. # flash_rodata
  81. placement_rules = list()
  82. rule = PlacementRule(None, None, None, self.model.sections["rodata"].entries, "flash_rodata")
  83. placement_rules.append(rule)
  84. rules["flash_rodata"] = placement_rules
  85. # dram0_data
  86. placement_rules = list()
  87. rule = PlacementRule(None, None, None, self.model.sections["data"].entries | self.model.sections["dram"].entries, "dram0_data")
  88. placement_rules.append(rule)
  89. rules["dram0_data"] = placement_rules
  90. # dram0_bss
  91. placement_rules = list()
  92. rule = PlacementRule(None, None, None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "dram0_bss")
  93. placement_rules.append(rule)
  94. rules["dram0_bss"] = placement_rules
  95. # iram0_text
  96. placement_rules = list()
  97. rule = PlacementRule(None, None, None, self.model.sections["iram"].entries, "iram0_text")
  98. placement_rules.append(rule)
  99. rules["iram0_text"] = placement_rules
  100. # rtc_text
  101. placement_rules = list()
  102. rule = PlacementRule(None, None, None, self.model.sections["rtc_text"].entries, "rtc_text")
  103. placement_rules.append(rule)
  104. rules["rtc_text"] = placement_rules
  105. # rtc_data
  106. placement_rules = list()
  107. rule = PlacementRule(None, None, None, self.model.sections["rtc_data"].entries | self.model.sections["rtc_rodata"].entries, "rtc_data")
  108. placement_rules.append(rule)
  109. rules["rtc_data"] = placement_rules
  110. # rtc_bss
  111. placement_rules = list()
  112. rule = PlacementRule(None, None, None, self.model.sections["rtc_bss"].entries, "rtc_bss")
  113. placement_rules.append(rule)
  114. rules["rtc_bss"] = placement_rules
  115. return rules
  116. def compare_rules(self, expected, actual):
  117. self.assertEqual(set(expected.keys()), set(actual.keys()))
  118. for (target, rules) in actual.items():
  119. message = "target: " + target
  120. actual_target_rules = rules
  121. expected_target_rules = expected[target]
  122. self.assertEqual(len(actual_target_rules), len(expected_target_rules))
  123. for actual_target_rule in actual_target_rules:
  124. self.assertTrue(actual_target_rule in expected_target_rules, message + str(actual_target_rule))
  125. for expected_target_rule in expected_target_rules:
  126. self.assertTrue(expected_target_rule in actual_target_rules, message + str(expected_target_rule))
  127. def get_default(self, target, rules):
  128. return rules[target][0]
  129. def test_rule_generation_default(self):
  130. normal = u"""
  131. [mapping:test]
  132. archive: libfreertos.a
  133. entries:
  134. * (default)
  135. """
  136. self.add_fragments(normal)
  137. actual = self.model.generate_rules(self.sections_info)
  138. expected = self.generate_default_rules()
  139. self.compare_rules(expected, actual)
  140. def test_rule_generation_nominal_1(self):
  141. normal = u"""
  142. [mapping:test]
  143. archive: libfreertos.a
  144. entries:
  145. * (noflash)
  146. """
  147. self.add_fragments(normal)
  148. actual = self.model.generate_rules(self.sections_info)
  149. expected = self.generate_default_rules()
  150. flash_text_default = self.get_default("flash_text", expected)
  151. flash_rodata_default = self.get_default("flash_rodata", expected)
  152. iram0_text_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  153. dram0_data_E1 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  154. # Add the exclusions
  155. flash_text_default.add_exclusion(iram0_text_E1)
  156. flash_rodata_default.add_exclusion(dram0_data_E1)
  157. # Add to the placement rules list
  158. expected["iram0_text"].append(iram0_text_E1)
  159. expected["dram0_data"].append(dram0_data_E1)
  160. self.compare_rules(expected, actual)
  161. def test_rule_generation_nominal_2(self):
  162. normal = u"""
  163. [mapping:test]
  164. archive: libfreertos.a
  165. entries:
  166. timers (rtc)
  167. """
  168. self.add_fragments(normal)
  169. actual = self.model.generate_rules(self.sections_info)
  170. expected = self.generate_default_rules()
  171. flash_text_default = self.get_default("flash_text", expected)
  172. flash_rodata_default = self.get_default("flash_rodata", expected)
  173. dram0_data_default = self.get_default("dram0_data", expected)
  174. dram0_bss_default = self.get_default("dram0_bss", expected)
  175. rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  176. rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  177. rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  178. # Add the exclusions
  179. flash_text_default.add_exclusion(rtc_text_E1)
  180. flash_rodata_default.add_exclusion(rtc_data_E1)
  181. dram0_data_default.add_exclusion(rtc_data_E1)
  182. dram0_bss_default.add_exclusion(rtc_bss_E1)
  183. # Add the rules
  184. expected["rtc_text"].append(rtc_text_E1)
  185. expected["rtc_data"].append(rtc_data_E1)
  186. expected["rtc_bss"].append(rtc_bss_E1)
  187. self.compare_rules(expected, actual)
  188. def test_rule_generation_nominal_3(self):
  189. normal = u"""
  190. [mapping:test]
  191. archive: libfreertos.a
  192. entries:
  193. timers (rtc)
  194. * (noflash)
  195. """
  196. self.add_fragments(normal)
  197. actual = self.model.generate_rules(self.sections_info)
  198. expected = self.generate_default_rules()
  199. flash_text_default = self.get_default("flash_text", expected)
  200. flash_rodata_default = self.get_default("flash_rodata", expected)
  201. dram0_data_default = self.get_default("dram0_data", expected)
  202. dram0_bss_default = self.get_default("dram0_bss", expected)
  203. rtc_text_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  204. rtc_data_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  205. rtc_bss_E1 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  206. iram0_text_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  207. dram0_data_E2 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  208. # Add the exclusions
  209. flash_text_default.add_exclusion(iram0_text_E2)
  210. flash_rodata_default.add_exclusion(dram0_data_E2)
  211. dram0_data_default.add_exclusion(rtc_data_E1)
  212. dram0_bss_default.add_exclusion(rtc_bss_E1)
  213. iram0_text_E2.add_exclusion(rtc_text_E1)
  214. dram0_data_E2.add_exclusion(rtc_data_E1)
  215. # Add the rules
  216. expected["iram0_text"].append(iram0_text_E2)
  217. expected["dram0_data"].append(dram0_data_E2)
  218. expected["rtc_text"].append(rtc_text_E1)
  219. expected["rtc_data"].append(rtc_data_E1)
  220. expected["rtc_bss"].append(rtc_bss_E1)
  221. self.compare_rules(expected, actual)
  222. def test_rule_generation_nominal_4(self):
  223. normal = u"""
  224. [mapping:test]
  225. archive: libfreertos.a
  226. entries:
  227. croutine (rtc)
  228. event_groups (noflash)
  229. timers (rtc)
  230. """
  231. self.add_fragments(normal)
  232. actual = self.model.generate_rules(self.sections_info)
  233. expected = self.generate_default_rules()
  234. flash_text_default = self.get_default("flash_text", expected)
  235. flash_rodata_default = self.get_default("flash_rodata", expected)
  236. dram0_data_default = self.get_default("dram0_data", expected)
  237. dram0_bss_default = self.get_default("dram0_bss", expected)
  238. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  239. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  240. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  241. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  242. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  243. rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  244. rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  245. rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  246. # Add the exclusions
  247. flash_text_default.add_exclusion(rtc_text_E3)
  248. flash_rodata_default.add_exclusion(rtc_data_E3)
  249. dram0_data_default.add_exclusion(rtc_data_E3)
  250. dram0_bss_default.add_exclusion(rtc_bss_E3)
  251. flash_text_default.add_exclusion(iram0_text_E2)
  252. flash_rodata_default.add_exclusion(dram0_data_E2)
  253. flash_text_default.add_exclusion(rtc_text_E1)
  254. flash_rodata_default.add_exclusion(rtc_data_E1)
  255. dram0_data_default.add_exclusion(rtc_data_E1)
  256. dram0_bss_default.add_exclusion(rtc_bss_E1)
  257. # Add the rules
  258. expected["rtc_text"].append(rtc_text_E3)
  259. expected["rtc_data"].append(rtc_data_E3)
  260. expected["rtc_bss"].append(rtc_bss_E3)
  261. expected["iram0_text"].append(iram0_text_E2)
  262. expected["dram0_data"].append(dram0_data_E2)
  263. expected["rtc_text"].append(rtc_text_E1)
  264. expected["rtc_data"].append(rtc_data_E1)
  265. expected["rtc_bss"].append(rtc_bss_E1)
  266. self.compare_rules(expected, actual)
  267. def test_rule_generation_nominal_5(self):
  268. normal = u"""
  269. [mapping:test]
  270. archive: libfreertos.a
  271. entries:
  272. croutine (rtc)
  273. event_groups (noflash)
  274. timers (rtc)
  275. * (noflash)
  276. """
  277. self.add_fragments(normal)
  278. actual = self.model.generate_rules(self.sections_info)
  279. expected = self.generate_default_rules()
  280. flash_text_default = self.get_default("flash_text", expected)
  281. flash_rodata_default = self.get_default("flash_rodata", expected)
  282. dram0_data_default = self.get_default("dram0_data", expected)
  283. dram0_bss_default = self.get_default("dram0_bss", expected)
  284. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  285. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  286. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  287. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  288. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  289. rtc_text_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["text"].entries, "rtc_text")
  290. rtc_data_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  291. rtc_bss_E3 = PlacementRule("libfreertos.a", "timers", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  292. iram0_text_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  293. dram0_data_E4 = PlacementRule("libfreertos.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  294. # Add the exclusions
  295. flash_text_default.add_exclusion(iram0_text_E4)
  296. flash_rodata_default.add_exclusion(dram0_data_E4)
  297. iram0_text_E4.add_exclusion(rtc_text_E3)
  298. dram0_data_E4.add_exclusion(rtc_data_E3)
  299. dram0_data_default.add_exclusion(rtc_data_E3)
  300. dram0_bss_default.add_exclusion(rtc_bss_E3)
  301. iram0_text_E4.add_exclusion(iram0_text_E2)
  302. dram0_data_E4.add_exclusion(dram0_data_E2)
  303. iram0_text_E4.add_exclusion(rtc_text_E1)
  304. dram0_data_E4.add_exclusion(rtc_data_E1)
  305. dram0_data_default.add_exclusion(rtc_data_E1)
  306. dram0_bss_default.add_exclusion(rtc_bss_E1)
  307. # Add the rules
  308. expected["iram0_text"].append(iram0_text_E4)
  309. expected["dram0_data"].append(dram0_data_E4)
  310. expected["rtc_text"].append(rtc_text_E3)
  311. expected["rtc_data"].append(rtc_data_E3)
  312. expected["rtc_bss"].append(rtc_bss_E3)
  313. expected["iram0_text"].append(iram0_text_E2)
  314. expected["dram0_data"].append(dram0_data_E2)
  315. expected["rtc_text"].append(rtc_text_E1)
  316. expected["rtc_data"].append(rtc_data_E1)
  317. expected["rtc_bss"].append(rtc_bss_E1)
  318. self.compare_rules(expected, actual)
  319. def test_rule_generation_nominal_6(self):
  320. normal = u"""
  321. [mapping:test]
  322. archive: libfreertos.a
  323. entries:
  324. croutine:prvCheckPendingReadyList (noflash)
  325. """
  326. self.add_fragments(normal)
  327. actual = self.model.generate_rules(self.sections_info)
  328. expected = self.generate_default_rules()
  329. flash_text_default = self.get_default("flash_text", expected)
  330. flash_rodata_default = self.get_default("flash_rodata", expected)
  331. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  332. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  333. iram0_text_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  334. dram0_data_E1_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  335. # Add the exclusions
  336. flash_text_default.add_exclusion(iram0_text_E1_extra, self.sections_info)
  337. flash_rodata_default.add_exclusion(dram0_data_E1_extra, self.sections_info)
  338. iram0_text_E1_extra.add_exclusion(iram0_text_E1, self.sections_info)
  339. dram0_data_E1_extra.add_exclusion(dram0_data_E1, self.sections_info)
  340. # Add the rules
  341. expected["flash_text"].append(iram0_text_E1_extra)
  342. expected["flash_rodata"].append(dram0_data_E1_extra)
  343. expected["iram0_text"].append(iram0_text_E1)
  344. expected["dram0_data"].append(dram0_data_E1)
  345. self.compare_rules(expected, actual)
  346. def test_rule_generation_nominal_7(self):
  347. normal = u"""
  348. [mapping:test]
  349. archive: libfreertos.a
  350. entries:
  351. croutine:prvCheckPendingReadyList (noflash)
  352. croutine:prvCheckDelayedList (noflash)
  353. croutine:xCoRoutineCreate (noflash)
  354. """
  355. self.add_fragments(normal)
  356. actual = self.model.generate_rules(self.sections_info)
  357. expected = self.generate_default_rules()
  358. flash_text_default = self.get_default("flash_text", expected)
  359. flash_rodata_default = self.get_default("flash_rodata", expected)
  360. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  361. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  362. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  363. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  364. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
  365. dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
  366. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  367. flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  368. # Add the exclusions
  369. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  370. flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
  371. flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
  372. flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
  373. flash_text_extra.add_exclusion(iram0_text_E2, self.sections_info)
  374. flash_rodata_extra.add_exclusion(dram0_data_E2, self.sections_info)
  375. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  376. flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
  377. # Add the rules
  378. expected["flash_text"].append(flash_text_extra)
  379. expected["flash_rodata"].append(flash_rodata_extra)
  380. expected["iram0_text"].append(iram0_text_E1)
  381. expected["dram0_data"].append(dram0_data_E1)
  382. expected["iram0_text"].append(iram0_text_E2)
  383. expected["dram0_data"].append(dram0_data_E2)
  384. expected["iram0_text"].append(iram0_text_E3)
  385. expected["dram0_data"].append(dram0_data_E3)
  386. self.compare_rules(expected, actual)
  387. def test_rule_generation_nominal_8(self):
  388. normal = u"""
  389. [mapping:test]
  390. archive: libfreertos.a
  391. entries:
  392. croutine:prvCheckPendingReadyList (noflash)
  393. croutine:prvCheckDelayedList (rtc)
  394. croutine:xCoRoutineCreate (noflash)
  395. """
  396. self.add_fragments(normal)
  397. actual = self.model.generate_rules(self.sections_info)
  398. expected = self.generate_default_rules()
  399. flash_text_default = self.get_default("flash_text", expected)
  400. flash_rodata_default = self.get_default("flash_rodata", expected)
  401. dram0_data_default = self.get_default("dram0_data", expected)
  402. dram0_bss_default = self.get_default("dram0_bss", expected)
  403. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  404. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["rodata"].entries, "dram0_data")
  405. rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  406. rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  407. self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  408. rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  409. self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  410. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["text"].entries, "iram0_text")
  411. dram0_data_E3 = PlacementRule("libfreertos.a", "croutine", "xCoRoutineCreate", self.model.sections["rodata"].entries, "dram0_data")
  412. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  413. flash_rodata_extra = PlacementRule("libfreertos.a", "croutine", None, [".rodata.*"], "flash_rodata")
  414. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
  415. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  416. # Add the exclusions
  417. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  418. flash_rodata_default.add_exclusion(flash_rodata_extra, self.sections_info)
  419. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  420. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  421. flash_text_extra.add_exclusion(iram0_text_E1, self.sections_info)
  422. flash_rodata_extra.add_exclusion(dram0_data_E1, self.sections_info)
  423. flash_text_extra.add_exclusion(rtc_text_E2, self.sections_info)
  424. dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
  425. flash_rodata_extra.add_exclusion(rtc_data_E2, self.sections_info)
  426. dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
  427. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  428. flash_rodata_extra.add_exclusion(dram0_data_E3, self.sections_info)
  429. # Add the rules
  430. expected["flash_text"].append(flash_text_extra)
  431. expected["flash_rodata"].append(flash_rodata_extra)
  432. expected["dram0_data"].append(dram0_data_extra)
  433. expected["dram0_bss"].append(dram0_bss_extra)
  434. expected["iram0_text"].append(iram0_text_E1)
  435. expected["dram0_data"].append(dram0_data_E1)
  436. expected["rtc_text"].append(rtc_text_E2)
  437. expected["rtc_data"].append(rtc_data_E2)
  438. expected["rtc_bss"].append(rtc_bss_E2)
  439. expected["iram0_text"].append(iram0_text_E3)
  440. expected["dram0_data"].append(dram0_data_E3)
  441. self.compare_rules(expected, actual)
  442. def test_rule_generation_nominal_9(self):
  443. normal = u"""
  444. [mapping:test]
  445. archive: libfreertos.a
  446. entries:
  447. croutine:prvCheckDelayedList (rtc)
  448. croutine (noflash)
  449. """
  450. self.add_fragments(normal)
  451. actual = self.model.generate_rules(self.sections_info)
  452. expected = self.generate_default_rules()
  453. flash_text_default = self.get_default("flash_text", expected)
  454. flash_rodata_default = self.get_default("flash_rodata", expected)
  455. dram0_data_default = self.get_default("dram0_data", expected)
  456. dram0_bss_default = self.get_default("dram0_bss", expected)
  457. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  458. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  459. self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  460. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  461. self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  462. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  463. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  464. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "dram0_data")
  465. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  466. # Add the exclusions
  467. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  468. flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
  469. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  470. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  471. dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  472. dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  473. iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
  474. dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
  475. # Add the rules
  476. expected["dram0_data"].append(dram0_data_extra)
  477. expected["dram0_bss"].append(dram0_bss_extra)
  478. expected["iram0_text"].append(iram0_text_E2)
  479. expected["dram0_data"].append(dram0_data_E2)
  480. expected["rtc_text"].append(rtc_text_E1)
  481. expected["rtc_data"].append(rtc_data_E1)
  482. expected["rtc_bss"].append(rtc_bss_E1)
  483. self.compare_rules(expected, actual)
  484. def test_rule_generation_nominal_10(self):
  485. normal = u"""
  486. [mapping:test]
  487. archive: libfreertos.a
  488. entries:
  489. croutine:prvCheckDelayedList (rtc)
  490. * (noflash)
  491. """
  492. self.add_fragments(normal)
  493. actual = self.model.generate_rules(self.sections_info)
  494. expected = self.generate_default_rules()
  495. flash_text_default = self.get_default("flash_text", expected)
  496. flash_rodata_default = self.get_default("flash_rodata", expected)
  497. iram0_text_default = self.get_default("iram0_text", expected)
  498. dram0_data_default = self.get_default("dram0_data", expected)
  499. dram0_bss_default = self.get_default("dram0_bss", expected)
  500. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  501. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  502. self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  503. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  504. self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  505. iram0_text_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  506. dram0_data_E2 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  507. iram0_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "iram0_text")
  508. dram0_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*", ".rodata.*"], "dram0_data")
  509. dram0_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "dram0_bss")
  510. # Add the exclusions
  511. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  512. flash_rodata_default.add_exclusion(dram0_data_E2, self.sections_info)
  513. iram0_text_default.add_exclusion(iram0_text_extra, self.sections_info)
  514. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  515. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  516. iram0_text_E2.add_exclusion(iram0_text_extra, self.sections_info)
  517. dram0_data_E2.add_exclusion(dram0_data_extra, self.sections_info)
  518. iram0_text_extra.add_exclusion(rtc_text_E1, self.sections_info)
  519. dram0_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  520. dram0_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  521. # Add the rules
  522. expected["iram0_text"].append(iram0_text_extra)
  523. expected["dram0_data"].append(dram0_data_extra)
  524. expected["dram0_bss"].append(dram0_bss_extra)
  525. expected["iram0_text"].append(iram0_text_E2)
  526. expected["dram0_data"].append(dram0_data_E2)
  527. expected["rtc_text"].append(rtc_text_E1)
  528. expected["rtc_data"].append(rtc_data_E1)
  529. expected["rtc_bss"].append(rtc_bss_E1)
  530. self.compare_rules(expected, actual)
  531. def test_rule_generation_nominal_11(self):
  532. normal = u"""
  533. [mapping:test]
  534. archive: libfreertos.a
  535. entries:
  536. croutine:prvCheckDelayedList (noflash)
  537. croutine (rtc)
  538. * (noflash)
  539. """
  540. self.add_fragments(normal)
  541. actual = self.model.generate_rules(self.sections_info)
  542. expected = self.generate_default_rules()
  543. flash_text_default = self.get_default("flash_text", expected)
  544. flash_rodata_default = self.get_default("flash_rodata", expected)
  545. iram0_text_default = self.get_default("iram0_text", expected)
  546. dram0_data_default = self.get_default("dram0_data", expected)
  547. dram0_bss_default = self.get_default("dram0_bss", expected)
  548. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  549. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  550. rtc_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  551. rtc_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  552. rtc_bss_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  553. iram0_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  554. dram0_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  555. # Add the exclusions
  556. flash_text_default.add_exclusion(iram0_text_E3, self.sections_info)
  557. flash_rodata_default.add_exclusion(dram0_data_E3, self.sections_info)
  558. iram0_text_default.add_exclusion(rtc_text_E2, self.sections_info)
  559. dram0_data_default.add_exclusion(rtc_data_E2, self.sections_info)
  560. dram0_bss_default.add_exclusion(rtc_bss_E2, self.sections_info)
  561. iram0_text_E3.add_exclusion(rtc_text_E2, self.sections_info)
  562. dram0_data_E3.add_exclusion(rtc_data_E2, self.sections_info)
  563. rtc_text_E2.add_exclusion(iram0_text_E1, self.sections_info)
  564. rtc_data_E2.add_exclusion(dram0_data_E1, self.sections_info)
  565. # Add the rules
  566. expected["iram0_text"].append(iram0_text_E1)
  567. expected["dram0_data"].append(dram0_data_E1)
  568. expected["rtc_text"].append(rtc_text_E2)
  569. expected["rtc_data"].append(rtc_data_E2)
  570. expected["rtc_bss"].append(rtc_bss_E2)
  571. expected["iram0_text"].append(iram0_text_E3)
  572. expected["dram0_data"].append(dram0_data_E3)
  573. self.compare_rules(expected, actual)
  574. def test_rule_generation_nominal_12(self):
  575. normal = u"""
  576. [mapping:test]
  577. archive: libfreertos.a
  578. entries:
  579. croutine:prvCheckDelayedList (rtc)
  580. croutine (noflash)
  581. * (rtc)
  582. """
  583. self.add_fragments(normal)
  584. actual = self.model.generate_rules(self.sections_info)
  585. expected = self.generate_default_rules()
  586. flash_text_default = self.get_default("flash_text", expected)
  587. flash_rodata_default = self.get_default("flash_rodata", expected)
  588. dram0_data_default = self.get_default("dram0_data", expected)
  589. dram0_bss_default = self.get_default("dram0_bss", expected)
  590. rtc_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "rtc_text")
  591. rtc_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  592. self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  593. rtc_bss_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList",
  594. self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  595. iram0_text_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  596. dram0_data_E2 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  597. rtc_text_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "rtc_text")
  598. rtc_data_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  599. rtc_bss_E3 = PlacementRule("libfreertos.a", None, None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  600. rtc_data_extra = PlacementRule("libfreertos.a", "croutine", None, [".data.*"], "rtc_data")
  601. rtc_bss_extra = PlacementRule("libfreertos.a", "croutine", None, [".bss.*"], "rtc_bss")
  602. # Add the exclusions
  603. flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
  604. flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
  605. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  606. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  607. rtc_text_E3.add_exclusion(iram0_text_E2, self.sections_info)
  608. rtc_data_E3.add_exclusion(dram0_data_E2, self.sections_info)
  609. rtc_data_E3.add_exclusion(rtc_data_extra, self.sections_info)
  610. rtc_bss_E3.add_exclusion(rtc_bss_extra, self.sections_info)
  611. rtc_data_extra.add_exclusion(rtc_data_E1, self.sections_info)
  612. rtc_bss_extra.add_exclusion(rtc_bss_E1, self.sections_info)
  613. iram0_text_E2.add_exclusion(rtc_text_E1, self.sections_info)
  614. dram0_data_E2.add_exclusion(rtc_data_E1, self.sections_info)
  615. # Add the rules
  616. expected["rtc_data"].append(rtc_data_extra)
  617. expected["rtc_bss"].append(rtc_bss_extra)
  618. expected["rtc_text"].append(rtc_text_E1)
  619. expected["rtc_data"].append(rtc_data_E1)
  620. expected["rtc_bss"].append(rtc_bss_E1)
  621. expected["iram0_text"].append(iram0_text_E2)
  622. expected["dram0_data"].append(dram0_data_E2)
  623. expected["rtc_text"].append(rtc_text_E3)
  624. expected["rtc_data"].append(rtc_data_E3)
  625. expected["rtc_bss"].append(rtc_bss_E3)
  626. self.compare_rules(expected, actual)
  627. def test_rule_generation_nominal_13(self):
  628. normal = u"""
  629. [mapping:test]
  630. archive: libfreertos.a
  631. entries:
  632. croutine:prvCheckDelayedList (noflash)
  633. event_groups:xEventGroupCreate (noflash)
  634. croutine (rtc)
  635. event_groups (rtc)
  636. * (noflash)
  637. """
  638. self.add_fragments(normal)
  639. actual = self.model.generate_rules(self.sections_info)
  640. expected = self.generate_default_rules()
  641. flash_text_default = self.get_default("flash_text", expected)
  642. flash_rodata_default = self.get_default("flash_rodata", expected)
  643. dram0_data_default = self.get_default("dram0_data", expected)
  644. dram0_bss_default = self.get_default("dram0_bss", expected)
  645. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  646. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  647. iram0_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "iram0_text")
  648. dram0_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["rodata"].entries, "dram0_data")
  649. rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  650. rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  651. rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  652. rtc_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "rtc_text")
  653. rtc_data_E4 = PlacementRule("libfreertos.a", "event_groups", None,
  654. self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  655. rtc_bss_E4 = PlacementRule("libfreertos.a", "event_groups", None,
  656. self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  657. iram0_text_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["text"].entries, "iram0_text")
  658. dram0_data_E5 = PlacementRule("libfreertos.a", None, None, self.model.sections["rodata"].entries, "dram0_data")
  659. # Add the exclusions
  660. flash_text_default.add_exclusion(iram0_text_E5, self.sections_info)
  661. flash_rodata_default.add_exclusion(dram0_data_E5, self.sections_info)
  662. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  663. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  664. dram0_bss_default.add_exclusion(rtc_bss_E4, self.sections_info)
  665. dram0_data_default.add_exclusion(rtc_data_E4, self.sections_info)
  666. iram0_text_E5.add_exclusion(rtc_text_E3, self.sections_info)
  667. dram0_data_E5.add_exclusion(rtc_data_E3, self.sections_info)
  668. iram0_text_E5.add_exclusion(rtc_text_E4, self.sections_info)
  669. dram0_data_E5.add_exclusion(rtc_data_E4, self.sections_info)
  670. rtc_text_E4.add_exclusion(iram0_text_E2, self.sections_info)
  671. rtc_data_E4.add_exclusion(dram0_data_E2, self.sections_info)
  672. rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
  673. rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
  674. # Add the rules
  675. expected["iram0_text"].append(iram0_text_E1)
  676. expected["dram0_data"].append(dram0_data_E1)
  677. expected["iram0_text"].append(iram0_text_E2)
  678. expected["dram0_data"].append(dram0_data_E2)
  679. expected["rtc_text"].append(rtc_text_E3)
  680. expected["rtc_data"].append(rtc_data_E3)
  681. expected["rtc_bss"].append(rtc_bss_E3)
  682. expected["rtc_text"].append(rtc_text_E4)
  683. expected["rtc_data"].append(rtc_data_E4)
  684. expected["rtc_bss"].append(rtc_bss_E4)
  685. expected["iram0_text"].append(iram0_text_E5)
  686. expected["dram0_data"].append(dram0_data_E5)
  687. self.compare_rules(expected, actual)
  688. def test_rule_generation_nominal_14(self):
  689. normal = u"""
  690. [mapping:test]
  691. archive: libfreertos.a
  692. entries:
  693. croutine:prvCheckDelayedList (noflash)
  694. event_groups:xEventGroupCreate (rtc)
  695. croutine (rtc)
  696. event_groups (noflash)
  697. """
  698. self.add_fragments(normal)
  699. actual = self.model.generate_rules(self.sections_info)
  700. expected = self.generate_default_rules()
  701. flash_text_default = self.get_default("flash_text", expected)
  702. flash_rodata_default = self.get_default("flash_rodata", expected)
  703. dram0_data_default = self.get_default("dram0_data", expected)
  704. dram0_bss_default = self.get_default("dram0_bss", expected)
  705. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  706. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["rodata"].entries, "dram0_data")
  707. rtc_text_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate", self.model.sections["text"].entries, "rtc_text")
  708. rtc_data_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
  709. self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  710. rtc_bss_E2 = PlacementRule("libfreertos.a", "event_groups", "xEventGroupCreate",
  711. self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  712. rtc_text_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "rtc_text")
  713. rtc_data_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["data"].entries | self.model.sections["rodata"].entries, "rtc_data")
  714. rtc_bss_E3 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["bss"].entries | self.model.sections["common"].entries, "rtc_bss")
  715. iram0_text_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["text"].entries, "iram0_text")
  716. dram0_data_E4 = PlacementRule("libfreertos.a", "event_groups", None, self.model.sections["rodata"].entries, "dram0_data")
  717. dram0_data_extra = PlacementRule("libfreertos.a", "event_groups", None, [".data.*"], "dram0_data")
  718. dram0_bss_extra = PlacementRule("libfreertos.a", "event_groups", None, [".bss.*"], "dram0_bss")
  719. # Add the exclusions
  720. flash_text_default.add_exclusion(iram0_text_E4, self.sections_info)
  721. flash_rodata_default.add_exclusion(dram0_data_E4, self.sections_info)
  722. dram0_data_default.add_exclusion(dram0_data_extra, self.sections_info)
  723. dram0_bss_default.add_exclusion(dram0_bss_extra, self.sections_info)
  724. flash_text_default.add_exclusion(rtc_text_E3, self.sections_info)
  725. flash_rodata_default.add_exclusion(rtc_data_E3, self.sections_info)
  726. dram0_data_default.add_exclusion(rtc_data_E3, self.sections_info)
  727. dram0_bss_default.add_exclusion(rtc_bss_E3, self.sections_info)
  728. iram0_text_E4.add_exclusion(rtc_text_E2, self.sections_info)
  729. dram0_data_E4.add_exclusion(rtc_data_E2, self.sections_info)
  730. dram0_data_extra.add_exclusion(rtc_data_E2, self.sections_info)
  731. dram0_bss_extra.add_exclusion(rtc_bss_E2, self.sections_info)
  732. rtc_text_E3.add_exclusion(iram0_text_E1, self.sections_info)
  733. rtc_data_E3.add_exclusion(dram0_data_E1, self.sections_info)
  734. # Add the rules
  735. expected["iram0_text"].append(iram0_text_E1)
  736. expected["dram0_data"].append(dram0_data_E1)
  737. expected["rtc_text"].append(rtc_text_E2)
  738. expected["rtc_data"].append(rtc_data_E2)
  739. expected["rtc_bss"].append(rtc_bss_E2)
  740. expected["rtc_text"].append(rtc_text_E3)
  741. expected["rtc_data"].append(rtc_data_E3)
  742. expected["rtc_bss"].append(rtc_bss_E3)
  743. expected["iram0_text"].append(iram0_text_E4)
  744. expected["dram0_data"].append(dram0_data_E4)
  745. expected["dram0_data"].append(dram0_data_extra)
  746. expected["dram0_bss"].append(dram0_bss_extra)
  747. self.compare_rules(expected, actual)
  748. def test_rule_generation_nominal_15(self):
  749. normal = u"""
  750. [mapping:test]
  751. archive: libfreertos.a
  752. entries:
  753. croutine (noflash_data)
  754. croutine (noflash_text)
  755. """
  756. self.add_fragments(normal)
  757. actual = self.model.generate_rules(self.sections_info)
  758. expected = self.generate_default_rules()
  759. flash_text_default = self.get_default("flash_text", expected)
  760. flash_rodata_default = self.get_default("flash_rodata", expected)
  761. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  762. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  763. # Add the exclusions
  764. flash_text_default.add_exclusion(iram0_text_E1)
  765. flash_rodata_default.add_exclusion(dram0_data_E1)
  766. # Add the rules
  767. expected["iram0_text"].append(iram0_text_E1)
  768. expected["dram0_data"].append(dram0_data_E1)
  769. self.compare_rules(expected, actual)
  770. def test_rule_generation_nominal_16(self):
  771. normal = u"""
  772. [mapping:test]
  773. archive: libfreertos.a
  774. entries:
  775. croutine (noflash_data)
  776. croutine (noflash)
  777. """
  778. self.add_fragments(normal)
  779. actual = self.model.generate_rules(self.sections_info)
  780. expected = self.generate_default_rules()
  781. flash_text_default = self.get_default("flash_text", expected)
  782. flash_rodata_default = self.get_default("flash_rodata", expected)
  783. iram0_text_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  784. dram0_data_E1 = PlacementRule("libfreertos.a", "croutine", None, self.model.sections["rodata"].entries, "dram0_data")
  785. # Add the exclusions
  786. flash_text_default.add_exclusion(iram0_text_E1)
  787. flash_rodata_default.add_exclusion(dram0_data_E1)
  788. # Add the rules
  789. expected["iram0_text"].append(iram0_text_E1)
  790. expected["dram0_data"].append(dram0_data_E1)
  791. self.compare_rules(expected, actual)
  792. def test_rule_generation_conflict(self):
  793. conflict_mapping = u"""
  794. [mapping:test]
  795. archive: libfreertos.a
  796. entries:
  797. croutine (conflict)
  798. croutine (noflash)
  799. [scheme:conflict]
  800. entries:
  801. rodata -> dram0_data
  802. bss -> dram0_data
  803. """
  804. self.add_fragments(conflict_mapping)
  805. with self.assertRaises(GenerationException):
  806. self.model.generate_rules(self.sections_info)
  807. def test_rule_generation_condition(self):
  808. generation_with_condition = u"""
  809. [mapping:test]
  810. archive: lib.a
  811. entries:
  812. if PERFORMANCE_LEVEL = 1:
  813. obj1 (noflash)
  814. elif PERFORMANCE_LEVEL = 2:
  815. obj1 (noflash)
  816. obj2 (noflash)
  817. elif PERFORMANCE_LEVEL = 3:
  818. obj1 (noflash)
  819. obj2 (noflash)
  820. obj3 (noflash)
  821. else: # PERFORMANCE_LEVEL = 0
  822. * (default)
  823. """
  824. for perf_level in range(0, 4):
  825. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  826. self.model.mappings = {}
  827. self.add_fragments(generation_with_condition)
  828. actual = self.model.generate_rules(self.sections_info)
  829. expected = self.generate_default_rules()
  830. if perf_level < 4:
  831. for append_no in range(1, perf_level + 1):
  832. flash_text_default = self.get_default("flash_text", expected)
  833. flash_rodata_default = self.get_default("flash_rodata", expected)
  834. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  835. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  836. flash_text_default.add_exclusion(iram_rule)
  837. flash_rodata_default.add_exclusion(dram_rule)
  838. expected["iram0_text"].append(iram_rule)
  839. expected["dram0_data"].append(dram_rule)
  840. self.compare_rules(expected, actual)
  841. def test_rule_generation_empty_entries(self):
  842. normal = u"""
  843. [mapping:test]
  844. archive: lib.a
  845. entries:
  846. if PERFORMANCE_LEVEL >= 1: # is false, generate no special rules
  847. obj.a (noflash)
  848. """
  849. self.add_fragments(normal)
  850. actual = self.model.generate_rules(self.sections_info)
  851. expected = self.generate_default_rules() # only default rules
  852. self.compare_rules(expected, actual)
  853. def test_conditional_sections_1(self):
  854. generation_with_condition = u"""
  855. [sections:cond_text_data]
  856. entries:
  857. if PERFORMANCE_LEVEL >= 1:
  858. .text+
  859. .literal+
  860. else:
  861. .data+
  862. [scheme:cond_noflash]
  863. entries:
  864. if PERFORMANCE_LEVEL >= 1:
  865. cond_text_data -> iram0_text
  866. else:
  867. cond_text_data -> dram0_data
  868. [mapping:test]
  869. archive: lib.a
  870. entries:
  871. * (cond_noflash)
  872. """
  873. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value("1")
  874. self.add_fragments(generation_with_condition)
  875. actual = self.model.generate_rules(self.sections_info)
  876. expected = self.generate_default_rules()
  877. flash_text_default = self.get_default("flash_text", expected)
  878. iram0_text_E1 = PlacementRule("lib.a", "*", None, self.model.sections["text"].entries, "iram0_text")
  879. # Add the exclusions
  880. flash_text_default.add_exclusion(iram0_text_E1)
  881. # Add to the placement rules list
  882. expected["iram0_text"].append(iram0_text_E1)
  883. self.compare_rules(expected, actual)
  884. def test_conditional_sections_2(self):
  885. generation_with_condition = u"""
  886. [sections:cond_text_data]
  887. entries:
  888. if PERFORMANCE_LEVEL >= 1:
  889. .text+
  890. .literal+
  891. else:
  892. .rodata+
  893. [scheme:cond_noflash]
  894. entries:
  895. if PERFORMANCE_LEVEL >= 1:
  896. cond_text_data -> iram0_text
  897. else:
  898. cond_text_data -> dram0_data
  899. [mapping:test]
  900. archive: lib.a
  901. entries:
  902. * (cond_noflash)
  903. """
  904. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value("0")
  905. self.add_fragments(generation_with_condition)
  906. actual = self.model.generate_rules(self.sections_info)
  907. expected = self.generate_default_rules()
  908. flash_rodata_default = self.get_default("flash_rodata", expected)
  909. dram0_data_E1 = PlacementRule("lib.a", "*", None, self.model.sections["rodata"].entries, "dram0_data")
  910. # Add the exclusions
  911. flash_rodata_default.add_exclusion(dram0_data_E1)
  912. # Add to the placement rules list
  913. expected["dram0_data"].append(dram0_data_E1)
  914. self.compare_rules(expected, actual)
  915. def test_rule_generation_condition_with_deprecated_mapping(self):
  916. generation_with_condition = u"""
  917. [mapping]
  918. archive: lib.a
  919. entries:
  920. : PERFORMANCE_LEVEL = 0
  921. : PERFORMANCE_LEVEL = 1
  922. obj1 (noflash)
  923. : PERFORMANCE_LEVEL = 2
  924. obj1 (noflash)
  925. obj2 (noflash)
  926. : PERFORMANCE_LEVEL = 3
  927. obj1 (noflash)
  928. obj2 (noflash)
  929. obj3 (noflash)
  930. """
  931. for perf_level in range(0, 4):
  932. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  933. self.model.mappings = {}
  934. self.add_fragments(generation_with_condition)
  935. actual = self.model.generate_rules(self.sections_info)
  936. expected = self.generate_default_rules()
  937. if perf_level < 4:
  938. for append_no in range(1, perf_level + 1):
  939. flash_text_default = self.get_default("flash_text", expected)
  940. flash_rodata_default = self.get_default("flash_rodata", expected)
  941. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  942. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  943. flash_text_default.add_exclusion(iram_rule)
  944. flash_rodata_default.add_exclusion(dram_rule)
  945. expected["iram0_text"].append(iram_rule)
  946. expected["dram0_data"].append(dram_rule)
  947. self.compare_rules(expected, actual)
  948. def test_rule_generation_multiple_deprecated_mapping_definitions(self):
  949. multiple_deprecated_definitions = u"""
  950. [mapping]
  951. archive: lib.a
  952. entries:
  953. : PERFORMANCE_LEVEL = 0
  954. : PERFORMANCE_LEVEL = 1
  955. obj1 (noflash)
  956. : PERFORMANCE_LEVEL = 2
  957. obj1 (noflash)
  958. : PERFORMANCE_LEVEL = 3
  959. obj1 (noflash)
  960. [mapping]
  961. archive: lib.a
  962. entries:
  963. : PERFORMANCE_LEVEL = 1
  964. obj1 (noflash) # ignore duplicate definition
  965. : PERFORMANCE_LEVEL = 2
  966. obj2 (noflash)
  967. : PERFORMANCE_LEVEL = 3
  968. obj2 (noflash)
  969. obj3 (noflash)
  970. """
  971. for perf_level in range(0, 4):
  972. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  973. self.model.mappings = {}
  974. self.add_fragments(multiple_deprecated_definitions)
  975. actual = self.model.generate_rules(self.sections_info)
  976. expected = self.generate_default_rules()
  977. if perf_level < 4:
  978. for append_no in range(1, perf_level + 1):
  979. flash_text_default = self.get_default("flash_text", expected)
  980. flash_rodata_default = self.get_default("flash_rodata", expected)
  981. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  982. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  983. flash_text_default.add_exclusion(iram_rule)
  984. flash_rodata_default.add_exclusion(dram_rule)
  985. expected["iram0_text"].append(iram_rule)
  986. expected["dram0_data"].append(dram_rule)
  987. self.compare_rules(expected, actual)
  988. def test_rule_generation_multiple_mapping_definitions(self):
  989. multiple_deprecated_definitions = u"""
  990. [mapping:base]
  991. archive: lib.a
  992. entries:
  993. if PERFORMANCE_LEVEL = 1:
  994. obj1 (noflash)
  995. elif PERFORMANCE_LEVEL = 2:
  996. obj1 (noflash)
  997. elif PERFORMANCE_LEVEL = 3:
  998. obj1 (noflash)
  999. else:
  1000. * (default)
  1001. [mapping:extra]
  1002. archive: lib.a
  1003. entries:
  1004. if PERFORMANCE_LEVEL = 1:
  1005. obj1 (noflash) # ignore duplicate definition
  1006. elif PERFORMANCE_LEVEL = 2:
  1007. obj2 (noflash)
  1008. elif PERFORMANCE_LEVEL = 3:
  1009. obj2 (noflash)
  1010. obj3 (noflash)
  1011. else:
  1012. * (default)
  1013. """
  1014. for perf_level in range(0, 4):
  1015. self.sdkconfig.config.syms["PERFORMANCE_LEVEL"].set_value(str(perf_level))
  1016. self.model.mappings = {}
  1017. self.add_fragments(multiple_deprecated_definitions)
  1018. actual = self.model.generate_rules(self.sections_info)
  1019. expected = self.generate_default_rules()
  1020. if perf_level < 4:
  1021. for append_no in range(1, perf_level + 1):
  1022. flash_text_default = self.get_default("flash_text", expected)
  1023. flash_rodata_default = self.get_default("flash_rodata", expected)
  1024. iram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["text"].entries, "iram0_text")
  1025. dram_rule = PlacementRule("lib.a", "obj" + str(append_no), None, self.model.sections["rodata"].entries, "dram0_data")
  1026. flash_text_default.add_exclusion(iram_rule)
  1027. flash_rodata_default.add_exclusion(dram_rule)
  1028. expected["iram0_text"].append(iram_rule)
  1029. expected["dram0_data"].append(dram_rule)
  1030. self.compare_rules(expected, actual)
  1031. def test_rules_order(self):
  1032. # The fragments are structured such that ldgen will:
  1033. # - parse freertos2 mapping first
  1034. # - entry for prvCheckPendingReadyList is parsed first before prvCheckDelayedList
  1035. # We expect that despite this, ldgen will output rules in a set order:
  1036. # by increasing specificity and alphabetically
  1037. test = u"""
  1038. [mapping:freertos2]
  1039. archive: libfreertos2.a
  1040. entries:
  1041. croutine2 (noflash_text)
  1042. croutine (noflash_text)
  1043. [mapping:freertos]
  1044. archive: libfreertos.a
  1045. entries:
  1046. croutine:prvCheckPendingReadyList (noflash_text)
  1047. croutine:prvCheckDelayedList (noflash_text)
  1048. """
  1049. self.add_fragments(test)
  1050. actual = self.model.generate_rules(self.sections_info)
  1051. expected = self.generate_default_rules()
  1052. flash_text_default = self.get_default("flash_text", expected)
  1053. iram0_text_E1 = PlacementRule("libfreertos2.a", "croutine2", None, self.model.sections["text"].entries, "iram0_text")
  1054. iram0_text_E2 = PlacementRule("libfreertos2.a", "croutine", None, self.model.sections["text"].entries, "iram0_text")
  1055. iram0_text_E3 = PlacementRule("libfreertos.a", "croutine", "prvCheckPendingReadyList", self.model.sections["text"].entries, "iram0_text")
  1056. iram0_text_E4 = PlacementRule("libfreertos.a", "croutine", "prvCheckDelayedList", self.model.sections["text"].entries, "iram0_text")
  1057. flash_text_extra = PlacementRule("libfreertos.a", "croutine", None, [".text.*", ".literal.*"], "flash_text")
  1058. # Add the exclusions
  1059. flash_text_default.add_exclusion(iram0_text_E1, self.sections_info)
  1060. flash_text_default.add_exclusion(iram0_text_E2, self.sections_info)
  1061. flash_text_default.add_exclusion(flash_text_extra, self.sections_info)
  1062. flash_text_extra.add_exclusion(iram0_text_E3, self.sections_info)
  1063. flash_text_extra.add_exclusion(iram0_text_E4, self.sections_info)
  1064. # Add the rules, arranged by expected order
  1065. expected["flash_text"].append(flash_text_extra)
  1066. expected["iram0_text"].append(iram0_text_E4)
  1067. expected["iram0_text"].append(iram0_text_E3)
  1068. expected["iram0_text"].append(iram0_text_E2)
  1069. expected["iram0_text"].append(iram0_text_E1)
  1070. # Perform general comparison for all sections
  1071. self.compare_rules(expected, actual)
  1072. # Perform ordered comparison
  1073. self.assertListEqual(actual["flash_text"], expected["flash_text"])
  1074. self.assertListEqual(actual["iram0_text"], expected["iram0_text"])
  1075. if __name__ == "__main__":
  1076. unittest.main()