nsdk_unittest.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. from nsdk_utils import *
  2. import unittest
  3. import os
  4. class TestFilterAppConfig(unittest.TestCase):
  5. def setUp(self):
  6. """设置测试环境"""
  7. if "SDK_SUPPORT_ARCH" in os.environ:
  8. del os.environ["SDK_SUPPORT_ARCH"]
  9. if "SDK_IGNORED_EXTS" in os.environ:
  10. del os.environ["SDK_IGNORED_EXTS"]
  11. def test_invalid_input(self):
  12. """测试无效输入"""
  13. self.assertEqual(filter_app_config(None), (False, ""))
  14. self.assertEqual(filter_app_config({}), (False, ""))
  15. self.assertEqual(filter_app_config({"no_build_config": {}}), (False, ""))
  16. def test_empty_build_config(self):
  17. """测试空的构建配置"""
  18. config = {"build_config": {}}
  19. self.assertEqual(filter_app_config(config), (False, ""))
  20. def test_arch_compatibility(self):
  21. """测试架构兼容性检查"""
  22. # 设置支持的架构
  23. os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdc"
  24. # 测试兼容的配置
  25. config = {
  26. "build_config": {
  27. "CORE": "n300f",
  28. "ARCH_EXT": ""
  29. }
  30. }
  31. self.assertEqual(filter_app_config(config), (False, ""))
  32. # 测试不兼容的配置
  33. config = {
  34. "build_config": {
  35. "CORE": "n300f",
  36. "ARCH_EXT": "v"
  37. }
  38. }
  39. filtered, msg = filter_app_config(config)
  40. self.assertTrue(filtered)
  41. self.assertTrue("not supported" in msg)
  42. def test_ignored_extensions(self):
  43. """测试被忽略的扩展"""
  44. os.environ["SDK_IGNORED_EXTS"] = "p_zfh"
  45. # 测试单字母扩展
  46. config = {
  47. "build_config": {
  48. "CORE": "n300f",
  49. "ARCH_EXT": "p"
  50. }
  51. }
  52. filtered, msg = filter_app_config(config)
  53. self.assertTrue(filtered)
  54. self.assertTrue("Filtered by p extension" in msg)
  55. # 测试多字母扩展
  56. config = {
  57. "build_config": {
  58. "CORE": "n300f",
  59. "ARCH_EXT": "i_zfh"
  60. }
  61. }
  62. filtered, msg = filter_app_config(config)
  63. self.assertTrue(filtered)
  64. self.assertTrue("Filtered by zfh extension" in msg)
  65. def test_extension_formats(self):
  66. """测试不同的扩展格式"""
  67. os.environ["SDK_IGNORED_EXTS"] = "zfh"
  68. # 测试前导下划线格式
  69. config = {
  70. "build_config": {
  71. "CORE": "n300f",
  72. "ARCH_EXT": "_zfh"
  73. }
  74. }
  75. filtered, msg = filter_app_config(config)
  76. self.assertTrue(filtered)
  77. # 测试无下划线格式
  78. config = {
  79. "build_config": {
  80. "CORE": "n300f",
  81. "ARCH_EXT": "zfh"
  82. }
  83. }
  84. filtered, msg = filter_app_config(config)
  85. self.assertTrue(filtered)
  86. def test_multiple_ignored_extensions(self):
  87. """测试多个被忽略的扩展"""
  88. os.environ["SDK_IGNORED_EXTS"] = "p_zfh_zvl128"
  89. # 测试匹配任意一个扩展
  90. config = {
  91. "build_config": {
  92. "CORE": "n300f",
  93. "ARCH_EXT": "i_zvl128"
  94. }
  95. }
  96. filtered, msg = filter_app_config(config)
  97. self.assertTrue(filtered)
  98. def test_no_ignored_extensions(self):
  99. """测试未设置忽略扩展的情况"""
  100. config = {
  101. "build_config": {
  102. "CORE": "n300f",
  103. "ARCH_EXT": "p_zfh"
  104. }
  105. }
  106. self.assertEqual(filter_app_config(config), (False, ""))
  107. def test_complex_arch_scenarios(self):
  108. """测试复杂的架构场景"""
  109. # 测试RV64
  110. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdc"
  111. config = {
  112. "build_config": {
  113. "CORE": "n900",
  114. "ARCH_EXT": "v_zfh"
  115. }
  116. }
  117. filtered, msg = filter_app_config(config)
  118. self.assertTrue(filtered)
  119. # 测试带版本号的扩展
  120. os.environ["SDK_SUPPORT_ARCH"] = "rv32imac_zicsr_zifencei"
  121. config = {
  122. "build_config": {
  123. "CORE": "n300",
  124. "ARCH_EXT": "zicsr_zifencei"
  125. }
  126. }
  127. self.assertEqual(filter_app_config(config), (False, ""))
  128. def test_invalid_arch_formats(self):
  129. """测试无效的架构格式"""
  130. # 测试无效的XLEN
  131. os.environ["SDK_SUPPORT_ARCH"] = "rv128imac"
  132. config = {
  133. "build_config": {
  134. "CORE": "n300f",
  135. "ARCH_EXT": ""
  136. }
  137. }
  138. self.assertEqual(filter_app_config(config), (False, ""))
  139. # 测试非法架构字符串
  140. os.environ["SDK_SUPPORT_ARCH"] = "invalid_arch"
  141. config = {
  142. "build_config": {
  143. "CORE": "n300f",
  144. "ARCH_EXT": ""
  145. }
  146. }
  147. self.assertEqual(filter_app_config(config), (False, ""))
  148. def test_special_extensions(self):
  149. """测试特殊扩展和扩展间的关系"""
  150. # 测试vector扩展的隐含关系
  151. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv"
  152. config = {
  153. "build_config": {
  154. "CORE": "nx900fd",
  155. "ARCH_EXT": "v_zvl128b"
  156. }
  157. }
  158. self.assertEqual(filter_app_config(config), (False, ""))
  159. # 测试DSP扩展的隐含关系
  160. os.environ["SDK_SUPPORT_ARCH"] = "rv32imafc_xxldspn3x"
  161. config = {
  162. "build_config": {
  163. "CORE": "n300f",
  164. "ARCH_EXT": "p_dspn3"
  165. }
  166. }
  167. self.assertEqual(filter_app_config(config), (False, ""))
  168. def test_core_configurations(self):
  169. """测试不同的CORE配置场景"""
  170. os.environ["SDK_SUPPORT_ARCH"] = "rv32imac"
  171. # 测试不存在的CORE
  172. config = {
  173. "build_config": {
  174. "CORE": "nonexist",
  175. "ARCH_EXT": ""
  176. }
  177. }
  178. self.assertEqual(filter_app_config(config), (False, ""))
  179. # 测试没有CORE配置
  180. config = {
  181. "build_config": {
  182. "ARCH_EXT": "v"
  183. }
  184. }
  185. self.assertEqual(filter_app_config(config), (False, ""))
  186. def test_mixed_extensions(self):
  187. """测试混合扩展场景"""
  188. # 测试扩展组合
  189. os.environ["SDK_IGNORED_EXTS"] = "zfh_zvl256b"
  190. config = {
  191. "build_config": {
  192. "CORE": "n300f",
  193. "ARCH_EXT": "v_zfh_zvl256b"
  194. }
  195. }
  196. filtered, msg = filter_app_config(config)
  197. self.assertTrue(filtered)
  198. # 测试重复扩展
  199. os.environ["SDK_IGNORED_EXTS"] = "p_p_zfh"
  200. config = {
  201. "build_config": {
  202. "CORE": "n300f",
  203. "ARCH_EXT": "p"
  204. }
  205. }
  206. filtered, msg = filter_app_config(config)
  207. self.assertTrue(filtered)
  208. def test_200series_cores(self):
  209. """测试200系列处理器核心"""
  210. os.environ["SDK_SUPPORT_ARCH"] = "rv32imac"
  211. # 测试基本RV32E核心
  212. config = {
  213. "build_config": {
  214. "CORE": "n200e",
  215. "ARCH_EXT": ""
  216. }
  217. }
  218. self.assertEqual(filter_app_config(config), (False, ""))
  219. # 测试带A扩展的核心
  220. config["build_config"]["CORE"] = "n201"
  221. self.assertEqual(filter_app_config(config), (False, ""))
  222. # 测试不兼容的扩展
  223. config = {
  224. "build_config": {
  225. "CORE": "n203",
  226. "ARCH_EXT": "v"
  227. }
  228. }
  229. filtered, msg = filter_app_config(config)
  230. self.assertTrue(filtered)
  231. def test_300series_cores(self):
  232. """测试300系列处理器核心"""
  233. # 测试浮点扩展兼容性
  234. os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdc"
  235. config = {
  236. "build_config": {
  237. "CORE": "n300fd",
  238. "ARCH_EXT": ""
  239. }
  240. }
  241. self.assertEqual(filter_app_config(config), (False, ""))
  242. # 测试单精度浮点
  243. os.environ["SDK_SUPPORT_ARCH"] = "rv32imafc"
  244. config["build_config"]["CORE"] = "n300f"
  245. self.assertEqual(filter_app_config(config), (False, ""))
  246. def test_600series_cores(self):
  247. """测试600系列处理器核心"""
  248. # 测试RV64核心
  249. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdc"
  250. config = {
  251. "build_config": {
  252. "CORE": "nx600fd",
  253. "ARCH_EXT": ""
  254. }
  255. }
  256. self.assertEqual(filter_app_config(config), (False, ""))
  257. # 测试RV64核心的向量扩展
  258. config = {
  259. "build_config": {
  260. "CORE": "ux600fd",
  261. "ARCH_EXT": "v"
  262. }
  263. }
  264. filtered, msg = filter_app_config(config)
  265. self.assertTrue(filtered)
  266. def test_900series_cores(self):
  267. """测试900系列处理器核心"""
  268. # 测试RV64核心与向量扩展
  269. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv"
  270. config = {
  271. "build_config": {
  272. "CORE": "nx900fd",
  273. "ARCH_EXT": "v_zvl512b"
  274. }
  275. }
  276. filtered, msg = filter_app_config(config)
  277. self.assertTrue(filtered)
  278. # 测试RV32核心
  279. os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdc"
  280. config = {
  281. "build_config": {
  282. "CORE": "n900fd",
  283. "ARCH_EXT": ""
  284. }
  285. }
  286. self.assertEqual(filter_app_config(config), (False, ""))
  287. def test_1000series_cores(self):
  288. """测试1000系列处理器核心"""
  289. # 测试RV64核心
  290. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdc_zfh_zvk_zvb"
  291. config = {
  292. "build_config": {
  293. "CORE": "nx1000fd",
  294. "ARCH_EXT": "_zfh_zvbb_zvbc_zvkg_zvkn"
  295. }
  296. }
  297. self.assertEqual(filter_app_config(config), (False, ""))
  298. # 测试用户级RV64核心
  299. config["build_config"]["CORE"] = "ux1000fd"
  300. self.assertEqual(filter_app_config(config), (False, ""))
  301. def test_vector_extensions(self):
  302. """测试向量扩展的各种组合"""
  303. # 测试RV32支持向量扩展
  304. os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdcv"
  305. test_cases = [
  306. ("v", False), # RV32支持向量扩展
  307. ("v_zvl128b", False), # RV32支持向量扩展
  308. ("v_zve32x", False), # RV32支持向量扩展
  309. ]
  310. for ext, should_filter in test_cases:
  311. config = {
  312. "build_config": {
  313. "CORE": "n300fd",
  314. "ARCH_EXT": ext
  315. }
  316. }
  317. filtered, msg = filter_app_config(config)
  318. self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
  319. if should_filter:
  320. self.assertTrue("not supported" in msg)
  321. # 测试RV64支持向量扩展
  322. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv"
  323. test_cases = [
  324. ("v", False), # 基本向量扩展
  325. ("v_zve64d", False), # 支持双精度向量
  326. ("v_zvl128b", False), # 支持128位向量
  327. ("v_zvl256b", True), # 不支持256位向量
  328. ]
  329. for ext, should_filter in test_cases:
  330. config = {
  331. "build_config": {
  332. "CORE": "nx900fd",
  333. "ARCH_EXT": ext
  334. }
  335. }
  336. filtered, _ = filter_app_config(config)
  337. self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
  338. def test_dsp_extensions(self):
  339. """测试DSP扩展的各种组合"""
  340. os.environ["SDK_SUPPORT_ARCH"] = "rv32imacp"
  341. test_cases = [
  342. ("p", False), # 基本P扩展
  343. ("p_dsp", False), # DSP扩展
  344. ("p_dspn1", True), # DSPN1扩展
  345. ("_dspn2", True), # 当前配置不支持DSPN2
  346. ("_dspn3", True), # 当前配置不支持DSPN3
  347. ]
  348. for ext, should_filter in test_cases:
  349. config = {
  350. "build_config": {
  351. "CORE": "n300",
  352. "ARCH_EXT": ext
  353. }
  354. }
  355. filtered, _ = filter_app_config(config)
  356. self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
  357. def test_k_extensions(self):
  358. """测试K扩展及其子扩展的组合"""
  359. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdck"
  360. test_cases = [
  361. ("k", False), # 基本K扩展
  362. ("k_zkn_zkr", False), # 支持的K子扩展组合
  363. ("k_zks_zkt", False), # 支持的K子扩展组合
  364. ("k_invalid_ext", True), # 无效的K扩展
  365. ]
  366. for ext, should_filter in test_cases:
  367. config = {
  368. "build_config": {
  369. "CORE": "nx1000fd",
  370. "ARCH_EXT": ext
  371. }
  372. }
  373. filtered, _ = filter_app_config(config)
  374. self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
  375. def test_mixed_extension_combinations(self):
  376. """测试多种扩展的混合组合"""
  377. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcvk_zve64d"
  378. test_cases = [
  379. ("vk", False), # 基本向量+K扩展
  380. ("vk_zve64d", False), # 带向量子扩展
  381. ("vk_invalid", True), # 无效扩展组合
  382. ("zc_zicsr", False), # 基础扩展组合
  383. ]
  384. for ext, should_filter in test_cases:
  385. config = {
  386. "build_config": {
  387. "CORE": "nx1000fd",
  388. "ARCH_EXT": ext
  389. }
  390. }
  391. filtered, _ = filter_app_config(config)
  392. self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
  393. def test_extension_compatibility(self):
  394. """测试扩展的兼容性检查"""
  395. test_cases = [
  396. ("rv32imafdc", "n300fd", "v", True), # RV32不支持向量
  397. ("rv64imafdcv", "nx900fd", "v", False), # RV64支持向量
  398. ("rv32imacp", "n300", "p_dsp", False), # 支持DSP
  399. ("rv64imafdck", "nx1000fd", "k_zkn", False), # 支持K扩展
  400. ("rv32imac", "n300", "zc", False), # 支持压缩指令
  401. ]
  402. for arch, core, ext, should_filter in test_cases:
  403. os.environ["SDK_SUPPORT_ARCH"] = arch
  404. config = {
  405. "build_config": {
  406. "CORE": core,
  407. "ARCH_EXT": ext
  408. }
  409. }
  410. filtered, _ = filter_app_config(config)
  411. self.assertEqual(filtered, should_filter,
  412. f"Failed for {arch} {core} with ext {ext}")
  413. def test_all_cores_basic(self):
  414. """测试所有核心的基本配置"""
  415. # 200系列测试
  416. test_cases = [
  417. ("n200", "rv32imc"), # 基本IMC核心
  418. ("n200e", "rv32emc"), # 基本EMC核心
  419. ("n201", "rv32iac"), # IAC核心
  420. ("n201e", "rv32eac"), # EAC核心
  421. ("n203", "rv32imac"), # IMAC核心
  422. ("n205", "rv32imac"), # IMAC核心
  423. # 300系列测试
  424. ("n300", "rv32imac"), # IMAC核心
  425. ("n300f", "rv32imafc"), # IMAFC核心
  426. ("n300fd", "rv32imafdc"), # IMAFDC核心
  427. ("n307fd", "rv32imafdc"), # IMAFDC核心
  428. # 600系列测试
  429. ("n600", "rv32imac"), # RV32 IMAC核心
  430. ("nx600", "rv64imac"), # RV64 IMAC核心
  431. ("u600fd", "rv32imafdc"),# RV32 IMAFDC核心
  432. ("nx600fd", "rv64imafdc"),# RV64 IMAFDC核心
  433. # 900和1000系列
  434. ("n900", "rv32imac"), # RV32 IMAC核心
  435. ("nx900fd", "rv64imafdc"),# RV64 IMAFDC核心
  436. ("nx1000fd", "rv64imafdc")# RV64 IMAFDC核心
  437. ]
  438. for core, arch in test_cases:
  439. os.environ["SDK_SUPPORT_ARCH"] = arch
  440. config = {
  441. "build_config": {
  442. "CORE": core,
  443. "ARCH_EXT": ""
  444. }
  445. }
  446. filtered, msg = filter_app_config(config)
  447. self.assertEqual(filtered, False,
  448. f"Failed for core {core} with arch {arch}")
  449. def test_advanced_extension_combinations(self):
  450. """测试高级扩展组合"""
  451. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv_zve64d_zkn_zks"
  452. test_cases = [
  453. # Vector扩展组合
  454. ("v_zve64d_zvl128b", False), # 基本向量组合
  455. ("v_zve64d_zvl256b", True), # 不支持的向量长度
  456. ("v_zve32x_zve64x_zve64d", False), # 向量扩展完整组合
  457. # K扩展组合
  458. ("k_zkn_zkr_zkt_zks", True), # K扩展完整组合
  459. ("_zkn", False), # K扩展支持组合
  460. ("k_zkne_zknd_zknh", True), # K加密扩展组合
  461. ("k_zbkb_zbkc_zbkx", True), # K位操作扩展组合
  462. # 混合扩展
  463. ("_zvk_zve64d_zkn", True), # 向量+K扩展
  464. ("_zvk_zve64d_zkn_zicsr", True), # 向量+K+基础扩展
  465. ("_zvk_zve64d_invalid", True), # 包含无效扩展
  466. # 特殊组合
  467. ("_zicsr_zifencei_zc", True), # 基础扩展组合
  468. ("_zicsr_zifencei", False), # 带前导下划线
  469. ("_zc_zicsr_zifencei", True), # 压缩指令组合
  470. ]
  471. for ext, should_filter in test_cases:
  472. config = {
  473. "build_config": {
  474. "CORE": "nx1000fd",
  475. "ARCH_EXT": ext
  476. }
  477. }
  478. filtered, msg = filter_app_config(config)
  479. self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
  480. if should_filter and "invalid" in ext:
  481. self.assertTrue("not supported" in msg)
  482. def test_dsp_advanced(self):
  483. """测试DSP扩展的高级组合"""
  484. test_cases = [
  485. # RV32 DSP测试
  486. ("rv32imacp_xxldsp", "p", False),
  487. ("rv32imacp_xxldspn1x", "p_dspn1", False),
  488. ("rv32imacp_xxldspn2x", "p_dspn2", False),
  489. ("rv32imacp", "p_dspn3", True),
  490. # RV64 DSP测试
  491. ("rv64imacp_xxldsp", "p", False),
  492. ("rv64imacp_xxldspn3x", "p_dspn3", False),
  493. # DSP组合测试
  494. ("rv32imacp_xxldspn3x", "p_dsp_dspn1_dspn2_dspn3", False),
  495. ("rv32imacp_xxldsp", "p_dspn1_dspn2", True),
  496. ]
  497. for arch, ext, should_filter in test_cases:
  498. os.environ["SDK_SUPPORT_ARCH"] = arch
  499. config = {
  500. "build_config": {
  501. "CORE": "n300" if arch.startswith("rv32") else "nx900",
  502. "ARCH_EXT": ext
  503. }
  504. }
  505. filtered, msg = filter_app_config(config)
  506. self.assertEqual(filtered, should_filter,
  507. f"Failed for {arch} with extension {ext}")
  508. def test_error_conditions(self):
  509. """测试错误情况处理"""
  510. os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcvk"
  511. test_cases = [
  512. # 架构不匹配
  513. ("nx1000fd", "v_invalid", True), # 无效向量扩展
  514. ("n300", "k_invalid", True), # RV32核心使用RV64扩展
  515. ("nx900fd", "p_invalid", True), # 无效P扩展
  516. # 特殊字符处理
  517. ("nx1000fd", "vk", False), # 多余的下划线
  518. ("nx1000fd", "v__k", True), # 连续下划线
  519. ("nx1000fd", " v_k ", True), # 额外空格
  520. # 极端情况
  521. ("nx1000fd", "", False), # 空扩展
  522. ("nx1000fd", "_", False), # 仅下划线
  523. ("nx1000fd", "___", False), # 多个下划线
  524. ]
  525. for core, ext, should_filter in test_cases:
  526. config = {
  527. "build_config": {
  528. "CORE": core,
  529. "ARCH_EXT": ext
  530. }
  531. }
  532. filtered, msg = filter_app_config(config)
  533. self.assertEqual(filtered, should_filter,
  534. f"Failed for core {core} with extension {ext}")
  535. if should_filter and "invalid" in ext:
  536. self.assertTrue("not supported" in msg)
  537. if __name__ == '__main__':
  538. unittest.main()