1039cdc35SXuan Hupackage xiangshan.backend.fu.NewCSR 2039cdc35SXuan Hu 31d192ad8SXuan Huimport chisel3._ 41d192ad8SXuan Huimport chisel3.util._ 51d192ad8SXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW} 61d192ad8SXuan Huimport xiangshan.backend.fu.NewCSR.ChiselRecordForField.AddRecordSpecifyFields 7039cdc35SXuan Hu 8039cdc35SXuan Huclass InterruptBundle extends CSRBundle { 9039cdc35SXuan Hu // Software Interrupt 10039cdc35SXuan Hu val SSI = RW(1) 11039cdc35SXuan Hu val VSSI = RW(2) 12039cdc35SXuan Hu val MSI = RW(3) 13039cdc35SXuan Hu // Time Interrupt 14039cdc35SXuan Hu val STI = RW(5) 15039cdc35SXuan Hu val VSTI = RW(6) 16039cdc35SXuan Hu val MTI = RW(7) 17039cdc35SXuan Hu // External Interrupt 18039cdc35SXuan Hu val SEI = RW(9) 19039cdc35SXuan Hu val VSEI = RW(10) 20039cdc35SXuan Hu val MEI = RW(11) 21039cdc35SXuan Hu val SGEI = RW(12) 22039cdc35SXuan Hu // SoC 231d192ad8SXuan Hu val LCOFI = RW(13) // Counter overflow interrupt 241d192ad8SXuan Hu val LC14I = RO(14) 251d192ad8SXuan Hu val LC15I = RO(15) 261d192ad8SXuan Hu val LC16I = RO(16) 271d192ad8SXuan Hu val LC17I = RO(17) 281d192ad8SXuan Hu val LC18I = RO(18) 291d192ad8SXuan Hu val LC19I = RO(19) 301d192ad8SXuan Hu val LC20I = RO(20) 311d192ad8SXuan Hu val LC21I = RO(21) 321d192ad8SXuan Hu val LC22I = RO(22) 331d192ad8SXuan Hu val LC23I = RO(23) 341d192ad8SXuan Hu val LC24I = RO(24) 351d192ad8SXuan Hu val LC25I = RO(25) 361d192ad8SXuan Hu val LC26I = RO(26) 371d192ad8SXuan Hu val LC27I = RO(27) 381d192ad8SXuan Hu val LC28I = RO(28) 391d192ad8SXuan Hu val LC29I = RO(29) 401d192ad8SXuan Hu val LC30I = RO(30) 411d192ad8SXuan Hu val LC31I = RO(31) 421d192ad8SXuan Hu val LC32I = RO(32) 431d192ad8SXuan Hu val LC33I = RO(33) 441d192ad8SXuan Hu val LC34I = RO(34) 451d192ad8SXuan Hu val LPRASEI = RO(35) 461d192ad8SXuan Hu val LC36I = RO(36) 471d192ad8SXuan Hu val LC37I = RO(37) 481d192ad8SXuan Hu val LC38I = RO(38) 491d192ad8SXuan Hu val LC39I = RO(39) 501d192ad8SXuan Hu val LC40I = RO(40) 511d192ad8SXuan Hu val LC41I = RO(41) 521d192ad8SXuan Hu val LC42I = RO(42) 531d192ad8SXuan Hu val HPRASEI = RO(43) 541d192ad8SXuan Hu val LC44I = RO(44) 551d192ad8SXuan Hu val LC45I = RO(45) 561d192ad8SXuan Hu val LC46I = RO(46) 571d192ad8SXuan Hu val LC47I = RO(47) 581d192ad8SXuan Hu val LC48I = RO(48) 591d192ad8SXuan Hu val LC49I = RO(49) 601d192ad8SXuan Hu val LC50I = RO(50) 611d192ad8SXuan Hu val LC51I = RO(51) 621d192ad8SXuan Hu val LC52I = RO(52) 631d192ad8SXuan Hu val LC53I = RO(53) 641d192ad8SXuan Hu val LC54I = RO(54) 651d192ad8SXuan Hu val LC55I = RO(55) 661d192ad8SXuan Hu val LC56I = RO(56) 671d192ad8SXuan Hu val LC57I = RO(57) 681d192ad8SXuan Hu val LC58I = RO(58) 691d192ad8SXuan Hu val LC59I = RO(59) 701d192ad8SXuan Hu val LC60I = RO(60) 711d192ad8SXuan Hu val LC61I = RO(61) 721d192ad8SXuan Hu val LC62I = RO(62) 731d192ad8SXuan Hu val LC63I = RO(63) 74039cdc35SXuan Hu 75039cdc35SXuan Hu def getVS = Seq(VSSI, VSTI, VSEI) 76039cdc35SXuan Hu 77039cdc35SXuan Hu def getHS = Seq(SSI, STI, SEI) 78039cdc35SXuan Hu 79039cdc35SXuan Hu def getM = Seq(MSI, MTI, MEI) 80039cdc35SXuan Hu 811d192ad8SXuan Hu def getNonLocal = Seq( 821d192ad8SXuan Hu SSI, VSSI, MSI, 831d192ad8SXuan Hu STI, VSTI, MTI, 841d192ad8SXuan Hu SEI, VSEI, MEI, 851d192ad8SXuan Hu SGEI 861d192ad8SXuan Hu ) 87ab449222SsinceforYy 881d192ad8SXuan Hu def getLocal = Seq( 891d192ad8SXuan Hu LCOFI,LC14I,LC15I, 901d192ad8SXuan Hu LC16I,LC17I,LC18I,LC19I,LC20I,LC21I,LC22I,LC23I, 911d192ad8SXuan Hu LC24I,LC25I,LC26I,LC27I,LC28I,LC29I,LC30I,LC31I, 921d192ad8SXuan Hu LC32I,LC33I,LC34I,LPRASEI,LC36I,LC37I,LC38I,LC39I, 931d192ad8SXuan Hu LC40I,LC41I,LC42I,HPRASEI,LC44I,LC45I,LC46I,LC47I, 941d192ad8SXuan Hu LC48I,LC49I,LC50I,LC51I,LC52I,LC53I,LC54I,LC55I, 951d192ad8SXuan Hu LC56I,LC57I,LC58I,LC59I,LC60I,LC61I,LC62I,LC63I, 961d192ad8SXuan Hu ) 971d192ad8SXuan Hu 981d192ad8SXuan Hu def getALL = getNonLocal ++ getLocal 99039cdc35SXuan Hu} 100039cdc35SXuan Hu 101039cdc35SXuan Huclass InterruptPendingBundle extends CSRBundle { 102039cdc35SXuan Hu // Software Interrupt 1031d192ad8SXuan Hu val SSIP = RO(1) 1041d192ad8SXuan Hu val VSSIP = RO(2) 1051d192ad8SXuan Hu val MSIP = RO(3) 106039cdc35SXuan Hu // Time Interrupt 1071d192ad8SXuan Hu val STIP = RO(5) 1081d192ad8SXuan Hu val VSTIP = RO(6) 1091d192ad8SXuan Hu val MTIP = RO(7) 110039cdc35SXuan Hu // External Interrupt 1111d192ad8SXuan Hu val SEIP = RO(9) 1121d192ad8SXuan Hu val VSEIP = RO(10) 1131d192ad8SXuan Hu val MEIP = RO(11) 1141d192ad8SXuan Hu val SGEIP = RO(12) 1151d192ad8SXuan Hu // Local Interrupt 1161d192ad8SXuan Hu val LCOFIP = RO(13) // Counter overflow interrupt 1171d192ad8SXuan Hu val LC14IP = RO(14) 1181d192ad8SXuan Hu val LC15IP = RO(15) 1191d192ad8SXuan Hu val LC16IP = RO(16) 1201d192ad8SXuan Hu val LC17IP = RO(17) 1211d192ad8SXuan Hu val LC18IP = RO(18) 1221d192ad8SXuan Hu val LC19IP = RO(19) 1231d192ad8SXuan Hu val LC20IP = RO(20) 1241d192ad8SXuan Hu val LC21IP = RO(21) 1251d192ad8SXuan Hu val LC22IP = RO(22) 1261d192ad8SXuan Hu val LC23IP = RO(23) 1271d192ad8SXuan Hu val LC24IP = RO(24) 1281d192ad8SXuan Hu val LC25IP = RO(25) 1291d192ad8SXuan Hu val LC26IP = RO(26) 1301d192ad8SXuan Hu val LC27IP = RO(27) 1311d192ad8SXuan Hu val LC28IP = RO(28) 1321d192ad8SXuan Hu val LC29IP = RO(29) 1331d192ad8SXuan Hu val LC30IP = RO(30) 1341d192ad8SXuan Hu val LC31IP = RO(31) 1351d192ad8SXuan Hu val LC32IP = RO(32) 1361d192ad8SXuan Hu val LC33IP = RO(33) 1371d192ad8SXuan Hu val LC34IP = RO(34) 1381d192ad8SXuan Hu val LPRASEIP = RO(35) // Low-priority RAS event interrupt 1391d192ad8SXuan Hu val LC36IP = RO(36) 1401d192ad8SXuan Hu val LC37IP = RO(37) 1411d192ad8SXuan Hu val LC38IP = RO(38) 1421d192ad8SXuan Hu val LC39IP = RO(39) 1431d192ad8SXuan Hu val LC40IP = RO(40) 1441d192ad8SXuan Hu val LC41IP = RO(41) 1451d192ad8SXuan Hu val LC42IP = RO(42) 1461d192ad8SXuan Hu val HPRASEIP = RO(43) // High-priority RAS event interrupt 1471d192ad8SXuan Hu val LC44IP = RO(44) 1481d192ad8SXuan Hu val LC45IP = RO(45) 1491d192ad8SXuan Hu val LC46IP = RO(46) 1501d192ad8SXuan Hu val LC47IP = RO(47) 1511d192ad8SXuan Hu val LC48IP = RO(48) 1521d192ad8SXuan Hu val LC49IP = RO(49) 1531d192ad8SXuan Hu val LC50IP = RO(50) 1541d192ad8SXuan Hu val LC51IP = RO(51) 1551d192ad8SXuan Hu val LC52IP = RO(52) 1561d192ad8SXuan Hu val LC53IP = RO(53) 1571d192ad8SXuan Hu val LC54IP = RO(54) 1581d192ad8SXuan Hu val LC55IP = RO(55) 1591d192ad8SXuan Hu val LC56IP = RO(56) 1601d192ad8SXuan Hu val LC57IP = RO(57) 1611d192ad8SXuan Hu val LC58IP = RO(58) 1621d192ad8SXuan Hu val LC59IP = RO(59) 1631d192ad8SXuan Hu val LC60IP = RO(60) 1641d192ad8SXuan Hu val LC61IP = RO(61) 1651d192ad8SXuan Hu val LC62IP = RO(62) 1661d192ad8SXuan Hu val LC63IP = RO(63) 167039cdc35SXuan Hu 168039cdc35SXuan Hu def getVS = Seq(VSSIP, VSTIP, VSEIP) 169039cdc35SXuan Hu 170039cdc35SXuan Hu def getHS = Seq(SSIP, STIP, SEIP) 171039cdc35SXuan Hu 172039cdc35SXuan Hu def getM = Seq(MSIP, MTIP, MEIP) 173039cdc35SXuan Hu 1741d192ad8SXuan Hu def getNonLocal = Seq( 1751d192ad8SXuan Hu SSIP, VSSIP, MSIP, 1761d192ad8SXuan Hu STIP, VSTIP, MTIP, 1771d192ad8SXuan Hu SEIP, VSEIP, MEIP, 1781d192ad8SXuan Hu SGEIP 1791d192ad8SXuan Hu ) 180039cdc35SXuan Hu 1811d192ad8SXuan Hu def getLocal = Seq( 1821d192ad8SXuan Hu LCOFIP,LC14IP,LC15IP, 1831d192ad8SXuan Hu LC16IP,LC17IP,LC18IP,LC19IP,LC20IP,LC21IP,LC22IP,LC23IP, 1841d192ad8SXuan Hu LC24IP,LC25IP,LC26IP,LC27IP,LC28IP,LC29IP,LC30IP,LC31IP, 1851d192ad8SXuan Hu LC32IP,LC33IP,LC34IP,LPRASEIP,LC36IP,LC37IP,LC38IP,LC39IP, 1861d192ad8SXuan Hu LC40IP,LC41IP,LC42IP,HPRASEIP,LC44IP,LC45IP,LC46IP,LC47IP, 1871d192ad8SXuan Hu LC48IP,LC49IP,LC50IP,LC51IP,LC52IP,LC53IP,LC54IP,LC55IP, 1881d192ad8SXuan Hu LC56IP,LC57IP,LC58IP,LC59IP,LC60IP,LC61IP,LC62IP,LC63IP, 1891d192ad8SXuan Hu ) 1901d192ad8SXuan Hu 1911d192ad8SXuan Hu def getALL = getNonLocal ++ getLocal 192039cdc35SXuan Hu} 193039cdc35SXuan Hu 194039cdc35SXuan Huclass InterruptEnableBundle extends CSRBundle { 195039cdc35SXuan Hu // Software Interrupt 1961d192ad8SXuan Hu val SSIE = RO(1) 1971d192ad8SXuan Hu val VSSIE = RO(2) 1981d192ad8SXuan Hu val MSIE = RO(3) 199039cdc35SXuan Hu // Time Interrupt 2001d192ad8SXuan Hu val STIE = RO(5) 2011d192ad8SXuan Hu val VSTIE = RO(6) 2021d192ad8SXuan Hu val MTIE = RO(7) 203039cdc35SXuan Hu // External Interrupt 2041d192ad8SXuan Hu val SEIE = RO(9) 2051d192ad8SXuan Hu val VSEIE = RO(10) 2061d192ad8SXuan Hu val MEIE = RO(11) 2071d192ad8SXuan Hu val SGEIE = RO(12) 208039cdc35SXuan Hu // SoC 2091d192ad8SXuan Hu val LCOFIE = RO(13) // Counter overflow interrupt 2101d192ad8SXuan Hu val LC14IE = RO(14) 2111d192ad8SXuan Hu val LC15IE = RO(15) 2121d192ad8SXuan Hu val LC16IE = RO(16) 2131d192ad8SXuan Hu val LC17IE = RO(17) 2141d192ad8SXuan Hu val LC18IE = RO(18) 2151d192ad8SXuan Hu val LC19IE = RO(19) 2161d192ad8SXuan Hu val LC20IE = RO(20) 2171d192ad8SXuan Hu val LC21IE = RO(21) 2181d192ad8SXuan Hu val LC22IE = RO(22) 2191d192ad8SXuan Hu val LC23IE = RO(23) 2201d192ad8SXuan Hu val LC24IE = RO(24) 2211d192ad8SXuan Hu val LC25IE = RO(25) 2221d192ad8SXuan Hu val LC26IE = RO(26) 2231d192ad8SXuan Hu val LC27IE = RO(27) 2241d192ad8SXuan Hu val LC28IE = RO(28) 2251d192ad8SXuan Hu val LC29IE = RO(29) 2261d192ad8SXuan Hu val LC30IE = RO(30) 2271d192ad8SXuan Hu val LC31IE = RO(31) 2281d192ad8SXuan Hu val LC32IE = RO(32) 2291d192ad8SXuan Hu val LC33IE = RO(33) 2301d192ad8SXuan Hu val LC34IE = RO(34) 2311d192ad8SXuan Hu val LPRASEIE = RO(35) // Low-priority RAS event interrupt 2321d192ad8SXuan Hu val LC36IE = RO(36) 2331d192ad8SXuan Hu val LC37IE = RO(37) 2341d192ad8SXuan Hu val LC38IE = RO(38) 2351d192ad8SXuan Hu val LC39IE = RO(39) 2361d192ad8SXuan Hu val LC40IE = RO(40) 2371d192ad8SXuan Hu val LC41IE = RO(41) 2381d192ad8SXuan Hu val LC42IE = RO(42) 2391d192ad8SXuan Hu val HPRASEIE = RO(43) // High-priority RAS event interrupt 2401d192ad8SXuan Hu val LC44IE = RO(44) 2411d192ad8SXuan Hu val LC45IE = RO(45) 2421d192ad8SXuan Hu val LC46IE = RO(46) 2431d192ad8SXuan Hu val LC47IE = RO(47) 2441d192ad8SXuan Hu val LC48IE = RO(48) 2451d192ad8SXuan Hu val LC49IE = RO(49) 2461d192ad8SXuan Hu val LC50IE = RO(50) 2471d192ad8SXuan Hu val LC51IE = RO(51) 2481d192ad8SXuan Hu val LC52IE = RO(52) 2491d192ad8SXuan Hu val LC53IE = RO(53) 2501d192ad8SXuan Hu val LC54IE = RO(54) 2511d192ad8SXuan Hu val LC55IE = RO(55) 2521d192ad8SXuan Hu val LC56IE = RO(56) 2531d192ad8SXuan Hu val LC57IE = RO(57) 2541d192ad8SXuan Hu val LC58IE = RO(58) 2551d192ad8SXuan Hu val LC59IE = RO(59) 2561d192ad8SXuan Hu val LC60IE = RO(60) 2571d192ad8SXuan Hu val LC61IE = RO(61) 2581d192ad8SXuan Hu val LC62IE = RO(62) 2591d192ad8SXuan Hu val LC63IE = RO(63) 260039cdc35SXuan Hu 261039cdc35SXuan Hu def getVS = Seq(VSSIE, VSTIE, VSEIE) 262039cdc35SXuan Hu 263039cdc35SXuan Hu def getHS = Seq(SSIE, STIE, SEIE) 264039cdc35SXuan Hu 265039cdc35SXuan Hu def getM = Seq(MSIE, MTIE, MEIE) 266039cdc35SXuan Hu 267a2eeddbfSXuan Hu def getNonVS = this.getHS ++ this.getM ++ this.getLocal :+ this.SGEIE 268a2eeddbfSXuan Hu 2691d192ad8SXuan Hu def getNonLocal = Seq( 2701d192ad8SXuan Hu SSIE, VSSIE, MSIE, 2711d192ad8SXuan Hu STIE, VSTIE, MTIE, 2721d192ad8SXuan Hu SEIE, VSEIE, MEIE, 2731d192ad8SXuan Hu SGEIE 2741d192ad8SXuan Hu ) 2758056933dSXuan Hu 2761d192ad8SXuan Hu def getLocal = Seq( 2771d192ad8SXuan Hu LCOFIE,LC14IE,LC15IE, 2781d192ad8SXuan Hu LC16IE,LC17IE,LC18IE,LC19IE,LC20IE,LC21IE,LC22IE,LC23IE, 2791d192ad8SXuan Hu LC24IE,LC25IE,LC26IE,LC27IE,LC28IE,LC29IE,LC30IE,LC31IE, 2801d192ad8SXuan Hu LC32IE,LC33IE,LC34IE,LPRASEIE,LC36IE,LC37IE,LC38IE,LC39IE, 2811d192ad8SXuan Hu LC40IE,LC41IE,LC42IE,HPRASEIE,LC44IE,LC45IE,LC46IE,LC47IE, 2821d192ad8SXuan Hu LC48IE,LC49IE,LC50IE,LC51IE,LC52IE,LC53IE,LC54IE,LC55IE, 2831d192ad8SXuan Hu LC56IE,LC57IE,LC58IE,LC59IE,LC60IE,LC61IE,LC62IE,LC63IE 2841d192ad8SXuan Hu ) 2851d192ad8SXuan Hu 2861d192ad8SXuan Hu def getALL = getNonLocal ++ getLocal 2871d192ad8SXuan Hu 2881d192ad8SXuan Hu def getRW = getALL.filter(_.isRW) 289039cdc35SXuan Hu} 290237d4cfdSXuan Hu 291c2a2229dSlewislzhclass NonMaskableIRPendingBundle extends CSRBundle { 2928bc90631SZehao Liu val NMI_31 = RW(31).withReset(0.U) 2938bc90631SZehao Liu val NMI_43 = RW(43).withReset(0.U) 294c2a2229dSlewislzh // reserve for more NMI type 295c2a2229dSlewislzh} 296c2a2229dSlewislzhobject NonMaskableIRNO{ 2978bc90631SZehao Liu final val NMI_43 = 43 2988bc90631SZehao Liu final val NMI_31 = 31 299c2a2229dSlewislzh // reserve for more NMI type 300c2a2229dSlewislzh 301c2a2229dSlewislzh val interruptDefaultPrio = Seq( 3028bc90631SZehao Liu NMI_43, NMI_31 303c2a2229dSlewislzh ) 304c2a2229dSlewislzh def getIRQHigherThan(irq: Int): Seq[Int] = { 305c2a2229dSlewislzh val idx = this.interruptDefaultPrio.indexOf(irq, 0) 306c2a2229dSlewislzh require(idx != -1, s"The irq($irq) does not exists in IntPriority Seq") 307c2a2229dSlewislzh this.interruptDefaultPrio.slice(0, idx) 308c2a2229dSlewislzh } 309c2a2229dSlewislzh 310c2a2229dSlewislzh} 311c2a2229dSlewislzh 312237d4cfdSXuan Huobject InterruptNO { 313237d4cfdSXuan Hu // Software Interrupt 314237d4cfdSXuan Hu final val SSI = 1 315237d4cfdSXuan Hu final val VSSI = 2 316237d4cfdSXuan Hu final val MSI = 3 317237d4cfdSXuan Hu // Time Interrupt 318237d4cfdSXuan Hu final val STI = 5 319237d4cfdSXuan Hu final val VSTI = 6 320237d4cfdSXuan Hu final val MTI = 7 321237d4cfdSXuan Hu // External Interrupt 322237d4cfdSXuan Hu final val SEI = 9 323237d4cfdSXuan Hu final val VSEI = 10 324237d4cfdSXuan Hu final val MEI = 11 325237d4cfdSXuan Hu final val SGEI = 12 3264016eee8SsinceforYy // SoC 3274016eee8SsinceforYy final val COI = 13 3284016eee8SsinceforYy final val LPRASEI = 35 3294016eee8SsinceforYy final val HPRASEI = 43 3304016eee8SsinceforYy 3313113cca9SsinceforYy val privArchGroup = Seq( 3324016eee8SsinceforYy MEI, MSI, MTI, 3334016eee8SsinceforYy SEI, SSI, STI, 3344016eee8SsinceforYy SGEI, 3354016eee8SsinceforYy VSEI, VSSI, VSTI, 336*a2cf5761SsinceforYy COI, 14, 15, 3374016eee8SsinceforYy ) 338423dd365SXuan Hu 3393174481bSXuan Hu val localHighGroup = Seq( 3403174481bSXuan Hu 47, 23, 46, 3413174481bSXuan Hu 45, 22, 44, 3423174481bSXuan Hu HPRASEI, 21, 42, 3433174481bSXuan Hu 41, 20, 40, 3443174481bSXuan Hu ) 3453174481bSXuan Hu 3463174481bSXuan Hu val localLowGroup = Seq( 3473174481bSXuan Hu 39, 19, 38, 3483174481bSXuan Hu 37, 18, 36, 3493174481bSXuan Hu LPRASEI, 17, 34, 3503174481bSXuan Hu 33, 16, 32, 3513174481bSXuan Hu ) 3523174481bSXuan Hu 3533174481bSXuan Hu val customHighestGroup = Seq( 3543174481bSXuan Hu 63, 31, 62, 3553174481bSXuan Hu 61, 30, 60, 3563174481bSXuan Hu ) 3573174481bSXuan Hu 3583174481bSXuan Hu val customMiddleHighGroup = Seq( 3593174481bSXuan Hu 59, 29, 58, 3603174481bSXuan Hu 57, 28, 56, 3613174481bSXuan Hu ) 3623174481bSXuan Hu 3633174481bSXuan Hu val customMiddleLowGroup = Seq( 3643174481bSXuan Hu 55, 27, 54, 3653174481bSXuan Hu 53, 26, 52, 3663174481bSXuan Hu ) 3673174481bSXuan Hu 3683174481bSXuan Hu val customLowestGroup = Seq( 3693174481bSXuan Hu 51, 25, 50, 3703174481bSXuan Hu 49, 24, 48, 3713174481bSXuan Hu ) 3723174481bSXuan Hu 3733113cca9SsinceforYy val interruptDefaultPrio = customHighestGroup ++ 3743113cca9SsinceforYy localHighGroup ++ 3753113cca9SsinceforYy customMiddleHighGroup ++ 3763113cca9SsinceforYy privArchGroup ++ 3773113cca9SsinceforYy customMiddleLowGroup ++ 3783113cca9SsinceforYy localLowGroup ++ 3793113cca9SsinceforYy customLowestGroup 3803113cca9SsinceforYy 3813174481bSXuan Hu def getPrioIdxInGroup(group: this.type => Seq[Int])(f: this.type => Int): Int = { 3823174481bSXuan Hu val idx = group(this).indexOf(f(this)) 383423dd365SXuan Hu assert(idx != -1) 384423dd365SXuan Hu idx 385423dd365SXuan Hu } 38673e616deSXuan Hu 38773e616deSXuan Hu def getVS = Seq(VSSI, VSTI, VSEI) 38873e616deSXuan Hu 38973e616deSXuan Hu def getHS = Seq(SSI, STI, SEI) 39073e616deSXuan Hu 39173e616deSXuan Hu def getM = Seq(MSI, MTI, MEI) 39273e616deSXuan Hu 39373e616deSXuan Hu def getNonLocal = Seq( 39473e616deSXuan Hu SSI, VSSI, MSI, 39573e616deSXuan Hu STI, VSTI, MTI, 39673e616deSXuan Hu SEI, VSEI, MEI, 39773e616deSXuan Hu SGEI 39873e616deSXuan Hu ) 39937e0d55eSsinceforYy 40037e0d55eSsinceforYy def getLocal = localHighGroup ++ localLowGroup ++ 40137e0d55eSsinceforYy customHighestGroup ++ customMiddleHighGroup ++ 40237e0d55eSsinceforYy customMiddleLowGroup ++ customLowestGroup ++ Seq(COI) 403237d4cfdSXuan Hu} 4041d192ad8SXuan Hu 4051d192ad8SXuan Hutrait HasIpIeBundle { self: CSRModule[_] => 4061d192ad8SXuan Hu val mideleg = IO(Input(new MidelegBundle)) 4071d192ad8SXuan Hu val mip = IO(Input(new MipBundle)) 4081d192ad8SXuan Hu val mie = IO(Input(new MieBundle)) 4091d192ad8SXuan Hu val mvip = IO(Input(new MvipBundle)) 4101d192ad8SXuan Hu val mvien = IO(Input(new MvienBundle)) 4111d192ad8SXuan Hu val hideleg = IO(Input(new HidelegBundle)) 4121d192ad8SXuan Hu val hip = IO(Input(new HipBundle)) 4131d192ad8SXuan Hu val hie = IO(Input(new HieBundle)) 4141d192ad8SXuan Hu val hvien = IO(Input(new HvienBundle)) 4151d192ad8SXuan Hu val hvip = IO(Input(new HvipBundle)) 4161d192ad8SXuan Hu val sip = IO(Input(new SipBundle)) 4171d192ad8SXuan Hu val sie = IO(Input(new SieBundle)) 4181d192ad8SXuan Hu val vsip = IO(Input(new VSipBundle)) 4191d192ad8SXuan Hu val vsie = IO(Input(new VSieBundle)) 4201d192ad8SXuan Hu val hgeip = IO(Input(new HgeipBundle)) 4211d192ad8SXuan Hu val hgeie = IO(Input(new HgeieBundle)) 4221d192ad8SXuan Hu val hstatusVGEIN = IO(Input(HstatusVgeinField())) 4231d192ad8SXuan Hu} 4241d192ad8SXuan Hu 4251d192ad8SXuan Hutrait ToAliasIpLocalPart extends Bundle { 4261d192ad8SXuan Hu val LCOFIP = ValidIO(RO(13)) // Counter overflow interrupt 4271d192ad8SXuan Hu val LC14IP = ValidIO(RO(14)) 4281d192ad8SXuan Hu val LC15IP = ValidIO(RO(15)) 4291d192ad8SXuan Hu val LC16IP = ValidIO(RO(16)) 4301d192ad8SXuan Hu val LC17IP = ValidIO(RO(17)) 4311d192ad8SXuan Hu val LC18IP = ValidIO(RO(18)) 4321d192ad8SXuan Hu val LC19IP = ValidIO(RO(19)) 4331d192ad8SXuan Hu val LC20IP = ValidIO(RO(20)) 4341d192ad8SXuan Hu val LC21IP = ValidIO(RO(21)) 4351d192ad8SXuan Hu val LC22IP = ValidIO(RO(22)) 4361d192ad8SXuan Hu val LC23IP = ValidIO(RO(23)) 4371d192ad8SXuan Hu val LC24IP = ValidIO(RO(24)) 4381d192ad8SXuan Hu val LC25IP = ValidIO(RO(25)) 4391d192ad8SXuan Hu val LC26IP = ValidIO(RO(26)) 4401d192ad8SXuan Hu val LC27IP = ValidIO(RO(27)) 4411d192ad8SXuan Hu val LC28IP = ValidIO(RO(28)) 4421d192ad8SXuan Hu val LC29IP = ValidIO(RO(29)) 4431d192ad8SXuan Hu val LC30IP = ValidIO(RO(30)) 4441d192ad8SXuan Hu val LC31IP = ValidIO(RO(31)) 4451d192ad8SXuan Hu val LC32IP = ValidIO(RO(32)) 4461d192ad8SXuan Hu val LC33IP = ValidIO(RO(33)) 4471d192ad8SXuan Hu val LC34IP = ValidIO(RO(34)) 4481d192ad8SXuan Hu val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt 4491d192ad8SXuan Hu val LC36IP = ValidIO(RO(36)) 4501d192ad8SXuan Hu val LC37IP = ValidIO(RO(37)) 4511d192ad8SXuan Hu val LC38IP = ValidIO(RO(38)) 4521d192ad8SXuan Hu val LC39IP = ValidIO(RO(39)) 4531d192ad8SXuan Hu val LC40IP = ValidIO(RO(40)) 4541d192ad8SXuan Hu val LC41IP = ValidIO(RO(41)) 4551d192ad8SXuan Hu val LC42IP = ValidIO(RO(42)) 4561d192ad8SXuan Hu val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt 4571d192ad8SXuan Hu val LC44IP = ValidIO(RO(44)) 4581d192ad8SXuan Hu val LC45IP = ValidIO(RO(45)) 4591d192ad8SXuan Hu val LC46IP = ValidIO(RO(46)) 4601d192ad8SXuan Hu val LC47IP = ValidIO(RO(47)) 4611d192ad8SXuan Hu val LC48IP = ValidIO(RO(48)) 4621d192ad8SXuan Hu val LC49IP = ValidIO(RO(49)) 4631d192ad8SXuan Hu val LC50IP = ValidIO(RO(50)) 4641d192ad8SXuan Hu val LC51IP = ValidIO(RO(51)) 4651d192ad8SXuan Hu val LC52IP = ValidIO(RO(52)) 4661d192ad8SXuan Hu val LC53IP = ValidIO(RO(53)) 4671d192ad8SXuan Hu val LC54IP = ValidIO(RO(54)) 4681d192ad8SXuan Hu val LC55IP = ValidIO(RO(55)) 4691d192ad8SXuan Hu val LC56IP = ValidIO(RO(56)) 4701d192ad8SXuan Hu val LC57IP = ValidIO(RO(57)) 4711d192ad8SXuan Hu val LC58IP = ValidIO(RO(58)) 4721d192ad8SXuan Hu val LC59IP = ValidIO(RO(59)) 4731d192ad8SXuan Hu val LC60IP = ValidIO(RO(60)) 4741d192ad8SXuan Hu val LC61IP = ValidIO(RO(61)) 4751d192ad8SXuan Hu val LC62IP = ValidIO(RO(62)) 4761d192ad8SXuan Hu val LC63IP = ValidIO(RO(63)) 4771d192ad8SXuan Hu 4781d192ad8SXuan Hu def getLocal = Seq( 4791d192ad8SXuan Hu LCOFIP, LC14IP, LC15IP, 4801d192ad8SXuan Hu LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP, 4811d192ad8SXuan Hu LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP, 4821d192ad8SXuan Hu LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP, 4831d192ad8SXuan Hu LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP, 4841d192ad8SXuan Hu LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP, 4851d192ad8SXuan Hu LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP, 4861d192ad8SXuan Hu ) 4871d192ad8SXuan Hu} 4881d192ad8SXuan Hu 4891d192ad8SXuan Huclass IeValidBundle extends Bundle with IgnoreSeqInBundle { 4901d192ad8SXuan Hu val SSIE = ValidIO(RO( 1)) 4911d192ad8SXuan Hu val VSSIE = ValidIO(RO( 2)) 4921d192ad8SXuan Hu val MSIE = ValidIO(RO( 3)) 4931d192ad8SXuan Hu val STIE = ValidIO(RO( 5)) 4941d192ad8SXuan Hu val VSTIE = ValidIO(RO( 6)) 4951d192ad8SXuan Hu val MTIE = ValidIO(RO( 7)) 4961d192ad8SXuan Hu val SEIE = ValidIO(RO( 9)) 4971d192ad8SXuan Hu val VSEIE = ValidIO(RO(10)) 4981d192ad8SXuan Hu val MEIE = ValidIO(RO(11)) 4991d192ad8SXuan Hu val SGEIE = ValidIO(RO(12)) 5001d192ad8SXuan Hu 5011d192ad8SXuan Hu val LCOFIE = ValidIO(RO(13)) // Counter overflow interrupt 5021d192ad8SXuan Hu val LC14IE = ValidIO(RO(14)) 5031d192ad8SXuan Hu val LC15IE = ValidIO(RO(15)) 5041d192ad8SXuan Hu val LC16IE = ValidIO(RO(16)) 5051d192ad8SXuan Hu val LC17IE = ValidIO(RO(17)) 5061d192ad8SXuan Hu val LC18IE = ValidIO(RO(18)) 5071d192ad8SXuan Hu val LC19IE = ValidIO(RO(19)) 5081d192ad8SXuan Hu val LC20IE = ValidIO(RO(20)) 5091d192ad8SXuan Hu val LC21IE = ValidIO(RO(21)) 5101d192ad8SXuan Hu val LC22IE = ValidIO(RO(22)) 5111d192ad8SXuan Hu val LC23IE = ValidIO(RO(23)) 5121d192ad8SXuan Hu val LC24IE = ValidIO(RO(24)) 5131d192ad8SXuan Hu val LC25IE = ValidIO(RO(25)) 5141d192ad8SXuan Hu val LC26IE = ValidIO(RO(26)) 5151d192ad8SXuan Hu val LC27IE = ValidIO(RO(27)) 5161d192ad8SXuan Hu val LC28IE = ValidIO(RO(28)) 5171d192ad8SXuan Hu val LC29IE = ValidIO(RO(29)) 5181d192ad8SXuan Hu val LC30IE = ValidIO(RO(30)) 5191d192ad8SXuan Hu val LC31IE = ValidIO(RO(31)) 5201d192ad8SXuan Hu val LC32IE = ValidIO(RO(32)) 5211d192ad8SXuan Hu val LC33IE = ValidIO(RO(33)) 5221d192ad8SXuan Hu val LC34IE = ValidIO(RO(34)) 5231d192ad8SXuan Hu val LPRASEIE = ValidIO(RO(35)) // Low-priority RAS event interrupt 5241d192ad8SXuan Hu val LC36IE = ValidIO(RO(36)) 5251d192ad8SXuan Hu val LC37IE = ValidIO(RO(37)) 5261d192ad8SXuan Hu val LC38IE = ValidIO(RO(38)) 5271d192ad8SXuan Hu val LC39IE = ValidIO(RO(39)) 5281d192ad8SXuan Hu val LC40IE = ValidIO(RO(40)) 5291d192ad8SXuan Hu val LC41IE = ValidIO(RO(41)) 5301d192ad8SXuan Hu val LC42IE = ValidIO(RO(42)) 5311d192ad8SXuan Hu val HPRASEIE = ValidIO(RO(43)) // High-priority RAS event interrupt 5321d192ad8SXuan Hu val LC44IE = ValidIO(RO(44)) 5331d192ad8SXuan Hu val LC45IE = ValidIO(RO(45)) 5341d192ad8SXuan Hu val LC46IE = ValidIO(RO(46)) 5351d192ad8SXuan Hu val LC47IE = ValidIO(RO(47)) 5361d192ad8SXuan Hu val LC48IE = ValidIO(RO(48)) 5371d192ad8SXuan Hu val LC49IE = ValidIO(RO(49)) 5381d192ad8SXuan Hu val LC50IE = ValidIO(RO(50)) 5391d192ad8SXuan Hu val LC51IE = ValidIO(RO(51)) 5401d192ad8SXuan Hu val LC52IE = ValidIO(RO(52)) 5411d192ad8SXuan Hu val LC53IE = ValidIO(RO(53)) 5421d192ad8SXuan Hu val LC54IE = ValidIO(RO(54)) 5431d192ad8SXuan Hu val LC55IE = ValidIO(RO(55)) 5441d192ad8SXuan Hu val LC56IE = ValidIO(RO(56)) 5451d192ad8SXuan Hu val LC57IE = ValidIO(RO(57)) 5461d192ad8SXuan Hu val LC58IE = ValidIO(RO(58)) 5471d192ad8SXuan Hu val LC59IE = ValidIO(RO(59)) 5481d192ad8SXuan Hu val LC60IE = ValidIO(RO(60)) 5491d192ad8SXuan Hu val LC61IE = ValidIO(RO(61)) 5501d192ad8SXuan Hu val LC62IE = ValidIO(RO(62)) 5511d192ad8SXuan Hu val LC63IE = ValidIO(RO(63)) 5521d192ad8SXuan Hu 5531d192ad8SXuan Hu val getVS = Seq(VSSIE, VSTIE, VSEIE) 5541d192ad8SXuan Hu 5551d192ad8SXuan Hu def getHS = Seq(SSIE, STIE, SEIE) 5561d192ad8SXuan Hu 5571d192ad8SXuan Hu def getM = Seq(MSIE, MTIE, MEIE) 5581d192ad8SXuan Hu 5591d192ad8SXuan Hu def getNonLocal = Seq( 5601d192ad8SXuan Hu SSIE, VSSIE, MSIE, 5611d192ad8SXuan Hu STIE, VSTIE, MTIE, 5621d192ad8SXuan Hu SEIE, VSEIE, MEIE, 5631d192ad8SXuan Hu SGEIE 5641d192ad8SXuan Hu ) 5651d192ad8SXuan Hu 5661d192ad8SXuan Hu def getLocal = Seq( 5671d192ad8SXuan Hu LCOFIE, LC14IE, LC15IE, 5681d192ad8SXuan Hu LC16IE, LC17IE, LC18IE, LC19IE, LC20IE, LC21IE, LC22IE, LC23IE, 5691d192ad8SXuan Hu LC24IE, LC25IE, LC26IE, LC27IE, LC28IE, LC29IE, LC30IE, LC31IE, 5701d192ad8SXuan Hu LC32IE, LC33IE, LC34IE, LPRASEIE, LC36IE, LC37IE, LC38IE, LC39IE, 5711d192ad8SXuan Hu LC40IE, LC41IE, LC42IE, HPRASEIE, LC44IE, LC45IE, LC46IE, LC47IE, 5721d192ad8SXuan Hu LC48IE, LC49IE, LC50IE, LC51IE, LC52IE, LC53IE, LC54IE, LC55IE, 5731d192ad8SXuan Hu LC56IE, LC57IE, LC58IE, LC59IE, LC60IE, LC61IE, LC62IE, LC63IE, 5741d192ad8SXuan Hu ) 5751d192ad8SXuan Hu 5761d192ad8SXuan Hu def getAll = getNonLocal ++ getLocal 5771d192ad8SXuan Hu 5781d192ad8SXuan Hu def getRW = getAll.filter(_.bits.isRW) 5791d192ad8SXuan Hu 5801d192ad8SXuan Hu def getNonRW = getAll.filterNot(_.bits.isRW) 5811d192ad8SXuan Hu 5821d192ad8SXuan Hu def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get 5831d192ad8SXuan Hu 5841d192ad8SXuan Hu def connectZeroNonRW : this.type = { 5851d192ad8SXuan Hu this.getNonRW.foreach(_.specifyField( 5861d192ad8SXuan Hu _.valid := false.B, 5871d192ad8SXuan Hu _.bits := DontCare 5881d192ad8SXuan Hu )) 5891d192ad8SXuan Hu this 5901d192ad8SXuan Hu } 5911d192ad8SXuan Hu} 5921d192ad8SXuan Hu 5931d192ad8SXuan Huclass IpValidBundle extends Bundle with IgnoreSeqInBundle { 5941d192ad8SXuan Hu val SSIP = ValidIO(RO( 1)) 5951d192ad8SXuan Hu val VSSIP = ValidIO(RO( 2)) 5961d192ad8SXuan Hu val MSIP = ValidIO(RO( 3)) 5971d192ad8SXuan Hu val STIP = ValidIO(RO( 5)) 5981d192ad8SXuan Hu val VSTIP = ValidIO(RO( 6)) 5991d192ad8SXuan Hu val MTIP = ValidIO(RO( 7)) 6001d192ad8SXuan Hu val SEIP = ValidIO(RO( 9)) 6011d192ad8SXuan Hu val VSEIP = ValidIO(RO(10)) 6021d192ad8SXuan Hu val MEIP = ValidIO(RO(11)) 6031d192ad8SXuan Hu val SGEIP = ValidIO(RO(12)) 6041d192ad8SXuan Hu 6051d192ad8SXuan Hu val LCOFIP = ValidIO(RO(13)) // Counter overflow interrupt 6061d192ad8SXuan Hu val LC14IP = ValidIO(RO(14)) 6071d192ad8SXuan Hu val LC15IP = ValidIO(RO(15)) 6081d192ad8SXuan Hu val LC16IP = ValidIO(RO(16)) 6091d192ad8SXuan Hu val LC17IP = ValidIO(RO(17)) 6101d192ad8SXuan Hu val LC18IP = ValidIO(RO(18)) 6111d192ad8SXuan Hu val LC19IP = ValidIO(RO(19)) 6121d192ad8SXuan Hu val LC20IP = ValidIO(RO(20)) 6131d192ad8SXuan Hu val LC21IP = ValidIO(RO(21)) 6141d192ad8SXuan Hu val LC22IP = ValidIO(RO(22)) 6151d192ad8SXuan Hu val LC23IP = ValidIO(RO(23)) 6161d192ad8SXuan Hu val LC24IP = ValidIO(RO(24)) 6171d192ad8SXuan Hu val LC25IP = ValidIO(RO(25)) 6181d192ad8SXuan Hu val LC26IP = ValidIO(RO(26)) 6191d192ad8SXuan Hu val LC27IP = ValidIO(RO(27)) 6201d192ad8SXuan Hu val LC28IP = ValidIO(RO(28)) 6211d192ad8SXuan Hu val LC29IP = ValidIO(RO(29)) 6221d192ad8SXuan Hu val LC30IP = ValidIO(RO(30)) 6231d192ad8SXuan Hu val LC31IP = ValidIO(RO(31)) 6241d192ad8SXuan Hu val LC32IP = ValidIO(RO(32)) 6251d192ad8SXuan Hu val LC33IP = ValidIO(RO(33)) 6261d192ad8SXuan Hu val LC34IP = ValidIO(RO(34)) 6271d192ad8SXuan Hu val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt 6281d192ad8SXuan Hu val LC36IP = ValidIO(RO(36)) 6291d192ad8SXuan Hu val LC37IP = ValidIO(RO(37)) 6301d192ad8SXuan Hu val LC38IP = ValidIO(RO(38)) 6311d192ad8SXuan Hu val LC39IP = ValidIO(RO(39)) 6321d192ad8SXuan Hu val LC40IP = ValidIO(RO(40)) 6331d192ad8SXuan Hu val LC41IP = ValidIO(RO(41)) 6341d192ad8SXuan Hu val LC42IP = ValidIO(RO(42)) 6351d192ad8SXuan Hu val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt 6361d192ad8SXuan Hu val LC44IP = ValidIO(RO(44)) 6371d192ad8SXuan Hu val LC45IP = ValidIO(RO(45)) 6381d192ad8SXuan Hu val LC46IP = ValidIO(RO(46)) 6391d192ad8SXuan Hu val LC47IP = ValidIO(RO(47)) 6401d192ad8SXuan Hu val LC48IP = ValidIO(RO(48)) 6411d192ad8SXuan Hu val LC49IP = ValidIO(RO(49)) 6421d192ad8SXuan Hu val LC50IP = ValidIO(RO(50)) 6431d192ad8SXuan Hu val LC51IP = ValidIO(RO(51)) 6441d192ad8SXuan Hu val LC52IP = ValidIO(RO(52)) 6451d192ad8SXuan Hu val LC53IP = ValidIO(RO(53)) 6461d192ad8SXuan Hu val LC54IP = ValidIO(RO(54)) 6471d192ad8SXuan Hu val LC55IP = ValidIO(RO(55)) 6481d192ad8SXuan Hu val LC56IP = ValidIO(RO(56)) 6491d192ad8SXuan Hu val LC57IP = ValidIO(RO(57)) 6501d192ad8SXuan Hu val LC58IP = ValidIO(RO(58)) 6511d192ad8SXuan Hu val LC59IP = ValidIO(RO(59)) 6521d192ad8SXuan Hu val LC60IP = ValidIO(RO(60)) 6531d192ad8SXuan Hu val LC61IP = ValidIO(RO(61)) 6541d192ad8SXuan Hu val LC62IP = ValidIO(RO(62)) 6551d192ad8SXuan Hu val LC63IP = ValidIO(RO(63)) 6561d192ad8SXuan Hu 6571d192ad8SXuan Hu val getVS = Seq(VSSIP, VSTIP, VSEIP) 6581d192ad8SXuan Hu 6591d192ad8SXuan Hu def getHS = Seq(SSIP, STIP, SEIP) 6601d192ad8SXuan Hu 6611d192ad8SXuan Hu def getM = Seq(MSIP, MTIP, MEIP) 6621d192ad8SXuan Hu 6631d192ad8SXuan Hu def getNonLocal = Seq( 6641d192ad8SXuan Hu SSIP, VSSIP, MSIP, 6651d192ad8SXuan Hu STIP, VSTIP, MTIP, 6661d192ad8SXuan Hu SEIP, VSEIP, MEIP, 6671d192ad8SXuan Hu SGEIP 6681d192ad8SXuan Hu ) 6691d192ad8SXuan Hu 6701d192ad8SXuan Hu def getLocal = Seq( 6711d192ad8SXuan Hu LCOFIP, LC14IP, LC15IP, 6721d192ad8SXuan Hu LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP, 6731d192ad8SXuan Hu LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP, 6741d192ad8SXuan Hu LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP, 6751d192ad8SXuan Hu LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP, 6761d192ad8SXuan Hu LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP, 6771d192ad8SXuan Hu LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP, 6781d192ad8SXuan Hu ) 6791d192ad8SXuan Hu 6801d192ad8SXuan Hu def getAll = getNonLocal ++ getLocal 6811d192ad8SXuan Hu 6821d192ad8SXuan Hu def getRW = getAll.filter(_.bits.isRW) 6831d192ad8SXuan Hu 6841d192ad8SXuan Hu def getNonRW = getAll.filterNot(_.bits.isRW) 6851d192ad8SXuan Hu 6861d192ad8SXuan Hu def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get 6871d192ad8SXuan Hu 6881d192ad8SXuan Hu def connectZeroNonRW : this.type = { 6891d192ad8SXuan Hu this.getNonRW.foreach(_.specifyField( 6901d192ad8SXuan Hu _.valid := false.B, 6911d192ad8SXuan Hu _.bits := DontCare, 6921d192ad8SXuan Hu )) 6931d192ad8SXuan Hu this 6941d192ad8SXuan Hu } 6951d192ad8SXuan Hu} 696