| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612 |
- from nsdk_utils import *
- import unittest
- import os
- class TestFilterAppConfig(unittest.TestCase):
- def setUp(self):
- """设置测试环境"""
- if "SDK_SUPPORT_ARCH" in os.environ:
- del os.environ["SDK_SUPPORT_ARCH"]
- if "SDK_IGNORED_EXTS" in os.environ:
- del os.environ["SDK_IGNORED_EXTS"]
- def test_invalid_input(self):
- """测试无效输入"""
- self.assertEqual(filter_app_config(None), (False, ""))
- self.assertEqual(filter_app_config({}), (False, ""))
- self.assertEqual(filter_app_config({"no_build_config": {}}), (False, ""))
- def test_empty_build_config(self):
- """测试空的构建配置"""
- config = {"build_config": {}}
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_arch_compatibility(self):
- """测试架构兼容性检查"""
- # 设置支持的架构
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdc"
- # 测试兼容的配置
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试不兼容的配置
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "v"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- self.assertTrue("not supported" in msg)
- def test_ignored_extensions(self):
- """测试被忽略的扩展"""
- os.environ["SDK_IGNORED_EXTS"] = "p_zfh"
- # 测试单字母扩展
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "p"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- self.assertTrue("Filtered by p extension" in msg)
- # 测试多字母扩展
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "i_zfh"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- self.assertTrue("Filtered by zfh extension" in msg)
- def test_extension_formats(self):
- """测试不同的扩展格式"""
- os.environ["SDK_IGNORED_EXTS"] = "zfh"
- # 测试前导下划线格式
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "_zfh"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- # 测试无下划线格式
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "zfh"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- def test_multiple_ignored_extensions(self):
- """测试多个被忽略的扩展"""
- os.environ["SDK_IGNORED_EXTS"] = "p_zfh_zvl128"
- # 测试匹配任意一个扩展
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "i_zvl128"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- def test_no_ignored_extensions(self):
- """测试未设置忽略扩展的情况"""
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "p_zfh"
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_complex_arch_scenarios(self):
- """测试复杂的架构场景"""
- # 测试RV64
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdc"
- config = {
- "build_config": {
- "CORE": "n900",
- "ARCH_EXT": "v_zfh"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- # 测试带版本号的扩展
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imac_zicsr_zifencei"
- config = {
- "build_config": {
- "CORE": "n300",
- "ARCH_EXT": "zicsr_zifencei"
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_invalid_arch_formats(self):
- """测试无效的架构格式"""
- # 测试无效的XLEN
- os.environ["SDK_SUPPORT_ARCH"] = "rv128imac"
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试非法架构字符串
- os.environ["SDK_SUPPORT_ARCH"] = "invalid_arch"
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_special_extensions(self):
- """测试特殊扩展和扩展间的关系"""
- # 测试vector扩展的隐含关系
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv"
- config = {
- "build_config": {
- "CORE": "nx900fd",
- "ARCH_EXT": "v_zvl128b"
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试DSP扩展的隐含关系
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imafc_xxldspn3x"
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "p_dspn3"
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_core_configurations(self):
- """测试不同的CORE配置场景"""
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imac"
- # 测试不存在的CORE
- config = {
- "build_config": {
- "CORE": "nonexist",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试没有CORE配置
- config = {
- "build_config": {
- "ARCH_EXT": "v"
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_mixed_extensions(self):
- """测试混合扩展场景"""
- # 测试扩展组合
- os.environ["SDK_IGNORED_EXTS"] = "zfh_zvl256b"
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "v_zfh_zvl256b"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- # 测试重复扩展
- os.environ["SDK_IGNORED_EXTS"] = "p_p_zfh"
- config = {
- "build_config": {
- "CORE": "n300f",
- "ARCH_EXT": "p"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- def test_200series_cores(self):
- """测试200系列处理器核心"""
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imac"
- # 测试基本RV32E核心
- config = {
- "build_config": {
- "CORE": "n200e",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试带A扩展的核心
- config["build_config"]["CORE"] = "n201"
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试不兼容的扩展
- config = {
- "build_config": {
- "CORE": "n203",
- "ARCH_EXT": "v"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- def test_300series_cores(self):
- """测试300系列处理器核心"""
- # 测试浮点扩展兼容性
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdc"
- config = {
- "build_config": {
- "CORE": "n300fd",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试单精度浮点
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imafc"
- config["build_config"]["CORE"] = "n300f"
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_600series_cores(self):
- """测试600系列处理器核心"""
- # 测试RV64核心
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdc"
- config = {
- "build_config": {
- "CORE": "nx600fd",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试RV64核心的向量扩展
- config = {
- "build_config": {
- "CORE": "ux600fd",
- "ARCH_EXT": "v"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- def test_900series_cores(self):
- """测试900系列处理器核心"""
- # 测试RV64核心与向量扩展
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv"
- config = {
- "build_config": {
- "CORE": "nx900fd",
- "ARCH_EXT": "v_zvl512b"
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertTrue(filtered)
- # 测试RV32核心
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdc"
- config = {
- "build_config": {
- "CORE": "n900fd",
- "ARCH_EXT": ""
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_1000series_cores(self):
- """测试1000系列处理器核心"""
- # 测试RV64核心
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdc_zfh_zvk_zvb"
- config = {
- "build_config": {
- "CORE": "nx1000fd",
- "ARCH_EXT": "_zfh_zvbb_zvbc_zvkg_zvkn"
- }
- }
- self.assertEqual(filter_app_config(config), (False, ""))
- # 测试用户级RV64核心
- config["build_config"]["CORE"] = "ux1000fd"
- self.assertEqual(filter_app_config(config), (False, ""))
- def test_vector_extensions(self):
- """测试向量扩展的各种组合"""
- # 测试RV32支持向量扩展
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imafdcv"
- test_cases = [
- ("v", False), # RV32支持向量扩展
- ("v_zvl128b", False), # RV32支持向量扩展
- ("v_zve32x", False), # RV32支持向量扩展
- ]
- for ext, should_filter in test_cases:
- config = {
- "build_config": {
- "CORE": "n300fd",
- "ARCH_EXT": ext
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
- if should_filter:
- self.assertTrue("not supported" in msg)
- # 测试RV64支持向量扩展
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv"
- test_cases = [
- ("v", False), # 基本向量扩展
- ("v_zve64d", False), # 支持双精度向量
- ("v_zvl128b", False), # 支持128位向量
- ("v_zvl256b", True), # 不支持256位向量
- ]
- for ext, should_filter in test_cases:
- config = {
- "build_config": {
- "CORE": "nx900fd",
- "ARCH_EXT": ext
- }
- }
- filtered, _ = filter_app_config(config)
- self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
- def test_dsp_extensions(self):
- """测试DSP扩展的各种组合"""
- os.environ["SDK_SUPPORT_ARCH"] = "rv32imacp"
- test_cases = [
- ("p", False), # 基本P扩展
- ("p_dsp", False), # DSP扩展
- ("p_dspn1", True), # DSPN1扩展
- ("_dspn2", True), # 当前配置不支持DSPN2
- ("_dspn3", True), # 当前配置不支持DSPN3
- ]
- for ext, should_filter in test_cases:
- config = {
- "build_config": {
- "CORE": "n300",
- "ARCH_EXT": ext
- }
- }
- filtered, _ = filter_app_config(config)
- self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
- def test_k_extensions(self):
- """测试K扩展及其子扩展的组合"""
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdck"
- test_cases = [
- ("k", False), # 基本K扩展
- ("k_zkn_zkr", False), # 支持的K子扩展组合
- ("k_zks_zkt", False), # 支持的K子扩展组合
- ("k_invalid_ext", True), # 无效的K扩展
- ]
- for ext, should_filter in test_cases:
- config = {
- "build_config": {
- "CORE": "nx1000fd",
- "ARCH_EXT": ext
- }
- }
- filtered, _ = filter_app_config(config)
- self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
- def test_mixed_extension_combinations(self):
- """测试多种扩展的混合组合"""
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcvk_zve64d"
- test_cases = [
- ("vk", False), # 基本向量+K扩展
- ("vk_zve64d", False), # 带向量子扩展
- ("vk_invalid", True), # 无效扩展组合
- ("zc_zicsr", False), # 基础扩展组合
- ]
- for ext, should_filter in test_cases:
- config = {
- "build_config": {
- "CORE": "nx1000fd",
- "ARCH_EXT": ext
- }
- }
- filtered, _ = filter_app_config(config)
- self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
- def test_extension_compatibility(self):
- """测试扩展的兼容性检查"""
- test_cases = [
- ("rv32imafdc", "n300fd", "v", True), # RV32不支持向量
- ("rv64imafdcv", "nx900fd", "v", False), # RV64支持向量
- ("rv32imacp", "n300", "p_dsp", False), # 支持DSP
- ("rv64imafdck", "nx1000fd", "k_zkn", False), # 支持K扩展
- ("rv32imac", "n300", "zc", False), # 支持压缩指令
- ]
- for arch, core, ext, should_filter in test_cases:
- os.environ["SDK_SUPPORT_ARCH"] = arch
- config = {
- "build_config": {
- "CORE": core,
- "ARCH_EXT": ext
- }
- }
- filtered, _ = filter_app_config(config)
- self.assertEqual(filtered, should_filter,
- f"Failed for {arch} {core} with ext {ext}")
- def test_all_cores_basic(self):
- """测试所有核心的基本配置"""
- # 200系列测试
- test_cases = [
- ("n200", "rv32imc"), # 基本IMC核心
- ("n200e", "rv32emc"), # 基本EMC核心
- ("n201", "rv32iac"), # IAC核心
- ("n201e", "rv32eac"), # EAC核心
- ("n203", "rv32imac"), # IMAC核心
- ("n205", "rv32imac"), # IMAC核心
- # 300系列测试
- ("n300", "rv32imac"), # IMAC核心
- ("n300f", "rv32imafc"), # IMAFC核心
- ("n300fd", "rv32imafdc"), # IMAFDC核心
- ("n307fd", "rv32imafdc"), # IMAFDC核心
- # 600系列测试
- ("n600", "rv32imac"), # RV32 IMAC核心
- ("nx600", "rv64imac"), # RV64 IMAC核心
- ("u600fd", "rv32imafdc"),# RV32 IMAFDC核心
- ("nx600fd", "rv64imafdc"),# RV64 IMAFDC核心
- # 900和1000系列
- ("n900", "rv32imac"), # RV32 IMAC核心
- ("nx900fd", "rv64imafdc"),# RV64 IMAFDC核心
- ("nx1000fd", "rv64imafdc")# RV64 IMAFDC核心
- ]
- for core, arch in test_cases:
- os.environ["SDK_SUPPORT_ARCH"] = arch
- config = {
- "build_config": {
- "CORE": core,
- "ARCH_EXT": ""
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertEqual(filtered, False,
- f"Failed for core {core} with arch {arch}")
- def test_advanced_extension_combinations(self):
- """测试高级扩展组合"""
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcv_zve64d_zkn_zks"
- test_cases = [
- # Vector扩展组合
- ("v_zve64d_zvl128b", False), # 基本向量组合
- ("v_zve64d_zvl256b", True), # 不支持的向量长度
- ("v_zve32x_zve64x_zve64d", False), # 向量扩展完整组合
- # K扩展组合
- ("k_zkn_zkr_zkt_zks", True), # K扩展完整组合
- ("_zkn", False), # K扩展支持组合
- ("k_zkne_zknd_zknh", True), # K加密扩展组合
- ("k_zbkb_zbkc_zbkx", True), # K位操作扩展组合
- # 混合扩展
- ("_zvk_zve64d_zkn", True), # 向量+K扩展
- ("_zvk_zve64d_zkn_zicsr", True), # 向量+K+基础扩展
- ("_zvk_zve64d_invalid", True), # 包含无效扩展
- # 特殊组合
- ("_zicsr_zifencei_zc", True), # 基础扩展组合
- ("_zicsr_zifencei", False), # 带前导下划线
- ("_zc_zicsr_zifencei", True), # 压缩指令组合
- ]
- for ext, should_filter in test_cases:
- config = {
- "build_config": {
- "CORE": "nx1000fd",
- "ARCH_EXT": ext
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertEqual(filtered, should_filter, f"Failed for extension {ext}")
- if should_filter and "invalid" in ext:
- self.assertTrue("not supported" in msg)
- def test_dsp_advanced(self):
- """测试DSP扩展的高级组合"""
- test_cases = [
- # RV32 DSP测试
- ("rv32imacp_xxldsp", "p", False),
- ("rv32imacp_xxldspn1x", "p_dspn1", False),
- ("rv32imacp_xxldspn2x", "p_dspn2", False),
- ("rv32imacp", "p_dspn3", True),
- # RV64 DSP测试
- ("rv64imacp_xxldsp", "p", False),
- ("rv64imacp_xxldspn3x", "p_dspn3", False),
- # DSP组合测试
- ("rv32imacp_xxldspn3x", "p_dsp_dspn1_dspn2_dspn3", False),
- ("rv32imacp_xxldsp", "p_dspn1_dspn2", True),
- ]
- for arch, ext, should_filter in test_cases:
- os.environ["SDK_SUPPORT_ARCH"] = arch
- config = {
- "build_config": {
- "CORE": "n300" if arch.startswith("rv32") else "nx900",
- "ARCH_EXT": ext
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertEqual(filtered, should_filter,
- f"Failed for {arch} with extension {ext}")
- def test_error_conditions(self):
- """测试错误情况处理"""
- os.environ["SDK_SUPPORT_ARCH"] = "rv64imafdcvk"
- test_cases = [
- # 架构不匹配
- ("nx1000fd", "v_invalid", True), # 无效向量扩展
- ("n300", "k_invalid", True), # RV32核心使用RV64扩展
- ("nx900fd", "p_invalid", True), # 无效P扩展
- # 特殊字符处理
- ("nx1000fd", "vk", False), # 多余的下划线
- ("nx1000fd", "v__k", True), # 连续下划线
- ("nx1000fd", " v_k ", True), # 额外空格
- # 极端情况
- ("nx1000fd", "", False), # 空扩展
- ("nx1000fd", "_", False), # 仅下划线
- ("nx1000fd", "___", False), # 多个下划线
- ]
- for core, ext, should_filter in test_cases:
- config = {
- "build_config": {
- "CORE": core,
- "ARCH_EXT": ext
- }
- }
- filtered, msg = filter_app_config(config)
- self.assertEqual(filtered, should_filter,
- f"Failed for core {core} with extension {ext}")
- if should_filter and "invalid" in ext:
- self.assertTrue("not supported" in msg)
- if __name__ == '__main__':
- unittest.main()
|