Nader Karimi

188 papers A 3B 15C 1Misc 5Journal 129Unranked 35
YearRankTypeTitle / Venue / Authors
2025 J jnl
Multim. Tools Appl.
Maedeh Jamali, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2025 J jnl
Multim. Tools Appl.
Mohammad Hossein Givkashi, Mohammadreza Naderi, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2024 J jnl
CoRR
Maedeh Jamali, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2024 J jnl
CoRR
Mahdi Ahmadi, Nader Karimi, Shadrokh Samavi
2024 J jnl
Multim. Tools Appl.
Mohammadreza Naderi, Mohammad Hossein Givkashi, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2024 J jnl
CoRR
Farzaneh Koohestani, Zahra Nabizadeh-ShahreBabak, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2024 conf
AIIoT
Ali Tamizifar, Pouya Behzadifar, Zahra Sobhaninia, Nader Karimi, Pejman Khadivi, Shadrokh Samavi
2024 conf
AIIoT
Fatemeh Piri, Nader Karimi, Shadrokh Samavi
2024 J jnl
CoRR
Zahra Nabizadeh, Maedeh Jamali, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2024 conf
AIIoT
Farzaneh Koohestani, Zahra Nabizadeh-ShahreBabak, Nader Karimi, Shadrokh Samavi
2024 J jnl
Multim. Tools Appl.
Mohammad Hossein Givkashi, Mohammadreza Naderi, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2024 conf
AIIoT
Fatemehsadat Ghanadi Ladani, Nader Karimi, Pejman Khadivi, Shadrokh Samavi
2023 J jnl
Biomed. Signal Process. Control.
Zahra Sobhaninia, Nader Karimi, Pejman Khadivi, Shadrokh Samavi
2023 J jnl
Multim. Tools Appl.
Maedeh Jamali, Nader Karimi, Pejman Khadivi, Shahram Shirani, Shadrokh Samavi
2023 J jnl
Biomed. Signal Process. Control.
Ghazaleh Ghorbanzadeh, Zahra Nabizadeh, Nader Karimi, Pejman Khadivi, Ali Emami, Shadrokh Samavi
2023 J jnl
J. Ambient Intell. Humaniz. Comput.
Nasrin Tavakoli, Maryam Karimi, Alireza Norouzi, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2023 J jnl
Biomed. Signal Process. Control.
Mohammadreza Naderi, Nader Karimi, Ali Emami, Shahram Shirani, Shadrokh Samavi
2023 J jnl
CoRR
Zahra Sobhaninia, Nasrin Abharian, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2023 J jnl
CoRR
Farzaneh Koohestani, Nader Karimi, Shadrokh Samavi
2023 J jnl
Multim. Tools Appl.
Maedeh Jamali, Nader Karimi, Pejman Khadivi, Shahram Shirani, Shadrokh Samavi
2023 J jnl
CoRR
Mohammadreza Naderi, Mohammad Hossein Givkashi, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2023 J jnl
CoRR
Mohammad Hossein Givkashi, Mohammadreza Naderi, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2022 J jnl
CoRR
Arezoo PariZanganeh, Ghazaleh Ghorbanzadeh, Zahra Nabizadeh-ShahreBabak, Nader Karimi, Shadrokh Samavi
2022 J jnl
CoRR
Ghazaleh Ghorbanzadeh, Zahra Nabizadeh, Nader Karimi, Pejman Khadivi, Ali Emami, Shadrokh Samavi
2022 J jnl
CoRR
Mohammadreza Naderi, Nader Karimi, Ali Emami, Shahram Shirani, Shadrokh Samavi
2022 J jnl
CoRR
Mohammadreza Naderi, Mohammad Hossein Givkashi, Fatemeh Piri, Nader Karimi, Shadrokh Samavi
2022 J jnl
CoRR
Mohammadreza Naderi, Mohammad Hossein Givkashi, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2021 J jnl
CoRR
Zahra Sobhaninia, Nader Karimi, Pejman Khadivi, Shadrokh Samavi
2021 J jnl
Artif. Intell. Medicine
Sajjad Abbasi, Mohsen Hajabdollahi, Pejman Khadivi, Nader Karimi, Roshanak Roshandel, Shahram Shirani, Shadrokh Samavi
2021 J jnl
Comput. Math. Appl.
Rasool Alizadeh, Sina Rezaei Gomari, Ahmad Alizadeh, Nader Karimi, Larry K. B. Li
2021 J jnl
Multim. Tools Appl.
Mahdi Ahmadi, Nader Karimi, Shadrokh Samavi
2021 J jnl
Biomed. Signal Process. Control.
Zahra Nabizadeh-ShahreBabak, Nader Karimi, Pejman Khadivi, Roshanak Roshandel, Ali Emami, Shadrokh Samavi
2021 J jnl
CoRR
Mohammad H. Givkashi, Mahshid Hadipour, Arezoo PariZanganeh, Zahra Nabizadeh, Nader Karimi, Shadrokh Samavi
2021 J jnl
Comput. Math. Appl.
Seyed Mahmood Mousavi, Reza Kamali, Freshteh Sotoudeh, Nader Karimi, Danial Khojasteh
2021 J jnl
CoRR
Mohammadreza Naderi, Zahra Nabizadeh, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2021 J jnl
Multim. Tools Appl.
Maryam Karimi, Mansour Nejati, Pejman Khadivi, Nader Karimi, Shadrokh Samavi
2021 J jnl
CoRR
Mahdi Arab Loodaricheh, Nader Karimi, Shadrokh Samavi
2021 J jnl
CoRR
Maedeh Jamali, Nader Karimi, Pejman Khadivi, Shahram Shirani, Shadrokh Samavi
2021 J jnl
CoRR
Parham Yazdekhasty, Ali Zindari, Zahra Nabizadeh-ShahreBabak, Pejman Khadivi, Nader Karimi, Shadrokh Samavi
2021 J jnl
CoRR
Maedeh Jamali, Nader Karimi, Shadrokh Samavi
2020 J jnl
CoRR
Kamran Chitsaz, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2020 J jnl
CoRR
Mahnoosh Bagheri, Majid Mohrekesh, Nader Karimi, Shadrokh Samavi
2020 conf
ICPR Workshops (2)
Parham Yazdekhasty, Ali Zindari, Zahra Nabizadeh-ShahreBabak, Roshanak Roshandel, Pejman Khadivi, Nader Karimi, Shadrokh Samavi
2020 J jnl
CoRR
Parham Yazdekhasty, Ali Zindari, Zahra Nabizadeh-ShahreBabak, Roshanak Roshandel, Pejman Khadivi, Nader Karimi, Shadrokh Samavi
2020 J jnl
Multim. Tools Appl.
Hamidreza Zarrabi, Ali Emami, Pejman Khadivi, Nader Karimi, Shadrokh Samavi
2020 J jnl
CoRR
Zahra Sobhaninia, Nader Karimi, Pejman Khadivi, Roshanak Roshandel, Shadrokh Samavi
2020 J jnl
CoRR
Zahra Sobhaninia, Safiyeh Rezaei, Nader Karimi, Ali Emami, Shadrokh Samavi
2020 J jnl
CoRR
Sajjad Abbasi, Mohsen Hajabdollahi, Pejman Khadivi, Nader Karimi, Roshanak Roshandel, Shahram Shirani, Shadrokh Samavi
2020 B conf
ICIP
Morteza Mousa Pasandi, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2020 J jnl
CoRR
Morteza Mousa Pasandi, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2020 J jnl
CoRR
Mohsen Hajabdollahi, Nader Karimi, Shahram Shirani, Shadrokh Samavi
2020 J jnl
CoRR
Ghazale Ghorbanzade, Zahra Nabizadeh, Nader Karimi, Shadrokh Samavi
2020 C conf
ICMLA
Mahnoosh Bagheri, Majid Mohrekesh, Nader Karimi, Shadrokh Samavi, Shahram Shirani, Pejman Khadivi
2020 J jnl
CoRR
Morteza Mousa Pasandi, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi
2020 J jnl
Biomed. Signal Process. Control.
Mohsen Hajabdollahi, Reza Esfandiarpoor, Elyas Sabeti, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi
2020 J jnl
Expert Syst. Appl.
Mahdi Ahmadi, Alireza Norouzi, Nader Karimi, Shadrokh Samavi, Ali Emami
2020 J jnl
CoRR
Fateme Mostafaie, Reihaneh Teimouri, Zahra Nabizadeh, Nader Karimi, Shadrokh Samavi
2020 J jnl
CoRR
Ghazale Ghorbanzade, Zahra Nabizadeh-ShahreBabak, Shadrokh Samavi, Nader Karimi, Ali Emami, Pejman Khadivi
2020 J jnl
Comput. Medical Imaging Graph.
Mohsen Hajabdollahi, Reza Esfandiarpoor, Pejman Khadivi, Sayed Mohammad Reza Soroushmehr, Nader Karimi, Shadrokh Samavi
2020 J jnl
CoRR
Emad Malekhosseini, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2020 J jnl
CoRR
Sajjad Abbasi, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2020 conf
ICPR Workshops (4)
Kamran Chitsaz, Mohsen Hajabdollahi, Pejman Khadivi, Shadrokh Samavi, Nader Karimi, Shahram Shirani
2019 J jnl
CoRR
Fateme Mostafaie, Zahra Nabizadeh, Nader Karimi, Shadrokh Samavi
2019 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Hoda Mohaghegh, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2019 J jnl
CoRR
Reihaneh Teymoori, Zahra Nabizadeh, Nader Karimi, Shadrokh Samavi
2019 J jnl
CoRR
Hamidreza Zarrabi, Ali Emami, Pejman Khadivi, S. M. Reza Soroushmehr, Nader Karimi, Kayvan Najarian, Shadrokh Samavi
2019 J jnl
Digit. Signal Process.
Maryam Karimi, Najmeh Soltanian, Shadrokh Samavi, Kayvan Najarian, Nader Karimi, S. M. Reza Soroushmehr
2019 J jnl
CoRR
Mahdi Ahmadi, Nader Karimi, Shadrokh Samavi
2019 conf
EMBC
Mahnoosh Bagheri, Majid Mohrekesh, Milad Tehrani, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
Comput. Medical Imaging Graph.
Ebrahim Nasr-Esfahani, Shima Rafiei, Mohammad H. Jafari, Nader Karimi, James S. Wrobel, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
Entropy
Matthias Ziefuss, Nader Karimi, Florian Ries, Amsini Sadiki, Amirfarhang Mehdizadeh
2019 Misc conf
ICASSP
Alireza Norouzi, Ali Emami, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 conf
EMBC
Zahra Sobhaninia, Shima Rafiei, Ali Emami, Nader Karimi, Kayvan Najarian, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
CoRR
Zahra Sobhaninia, Shima Rafiei, Ali Emami, Nader Karimi, Kayvan Najarian, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
CoRR
Safiyeh Rezaei, Ali Emami, Nader Karimi, Shadrokh Samavi
2019 conf
EMBC
Safiyeh Rezaei, Ali Emami, Hamidreza Zarrabi, Shima Rafiei, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
CoRR
Safiyeh Rezaei, Ali Emami, Hamidreza Zarrabi, Shima Rafiei, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 conf
EMBC
Mohsen Hajabdollahi, Reza Esfandiarpoor, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
CoRR
Zahra Nabizadeh, Ghazale Ghorbanzade, Nader Karimi, Shadrokh Samavi
2019 J jnl
CoRR
Mahdi Ahmadi, Nader Karimi, Shadrokh Samavi
2019 conf
EMBC
Shima Rafiei, Nader Karimi, Behzad Mirmahboub, Kayvan Najarian, Banafsheh Felfeliyan, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
CoRR
Zahra Sobhaninia, Ali Emami, Nader Karimi, Shadrokh Samavi
2019 conf
EMBC
Mohsen Hajabdollahi, Reza Esfandiarpoor, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2019 J jnl
CoRR
Emad Malekhosseini, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi
2019 J jnl
CoRR
Sajjad Abbasi, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi
2019 J jnl
Entropy
Mohsen Torabi, Nader Karimi, Mostafa Ghiaasiaan, Somchai Wongwises
2019 J jnl
Int. J. Circuit Theory Appl.
Zohreh HosseinKhani, Mohsen Hajabdollahi, Nader Karimi, Kayvan Najarian, Ali Emami, Shahram Shirani, Shadrokh Samavi, Sayed Mohammad Reza Soroushmehr
2019 J jnl
CoRR
Maedeh Jamali, Mahnoosh Bagheri, Nader Karimi, Shadrokh Samavi
2019 J jnl
CoRR
Maedeh Jamali, Nader Karimi, Shadrokh Samavi
2019 J jnl
Biomed. Signal Process. Control.
Mohsen Hajabdollahi, Reza Esfandiarpoor, Pejman Khadivi, S. M. Reza Soroushmehr, Nader Karimi, Kayvan Najarian, Shadrokh Samavi
2018 J jnl
J. Medical Syst.
Zohreh HosseinKhani, Mohsen Hajabdollahi, Nader Karimi, S. Mohamad R. Soroushmehr, Shahram Shirani, Kayvan Najarian, Shadrokh Samavi
2018 J jnl
CoRR
Hamidreza Zarrabi, Ali Emami, Nader Karimi, Shadrokh Samavi
2018 B conf
ICIP
Mojtaba Akbari, Majid Mohrekesh, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2018 J jnl
J. Intell. Fuzzy Syst.
Maedeh Jamali, Shima Rafiei, S. M. Reza Soroushmehr, Nader Karimi, Shahram Shirani, Kayvan Najarian, Shadrokh Samavi
2018 J jnl
CoRR
Mojtaba Akbari, Majid Mohrekesh, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 conf
IST
Milad Tehrani, Mahnoosh Bagheri, Mahdi Ahmadi, Alireza Norouzi, Nader Karimi, Shadrokh Samavi
2018 J jnl
CoRR
Milad Tehrani, Mahnoosh Bagheri, Mahdi Ahmadi, Alireza Norouzi, Nader Karimi, Shadrokh Samavi
2018 J jnl
CoRR
Zahra Sobhaninia, Safiyeh Rezaei, Alireza Noroozi, Mehdi Ahmadi, Hamidreza Zarrabi, Nader Karimi, Ali Emami, Shadrokh Samavi
2018 conf
EMBC
Mojtaba Akbari, Majid Mohrekesh, Shima Rafiei, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Mahdi Ahmadi, Mohsen Hajabdollahi, Nader Karimi, Shadrokh Samavi
2018 J jnl
Entropy
Rohit Saini, Nader Karimi, Lian Duan, Amsini Sadiki, Amirfarhang Mehdizadeh
2018 J jnl
Multim. Tools Appl.
Majid Mohrekesh, Shekoofeh Azizi, Shahram Shirani, Nader Karimi, Shadrokh Samavi
2018 conf
EMBC
Mina Nasr-Esfahani, Majid Mohrekesh, Mojtaba Akbari, S. M. Reza Soroushmehr, Ebrahim Nasr-Esfahani, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Mina Nasr-Esfahani, Majid Mohrekesh, Mojtaba Akbari, S. M. Reza Soroushmehr, Ebrahim Nasr-Esfahani, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Alireza Norouzi, Ali Emami, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 B conf
ICIP
Shima Rafiei, Ebrahim Nasr-Esfahani, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2018 J jnl
CoRR
Shima Rafiei, Ebrahim Nasr-Esfahani, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 conf
EMBC
Mahdi Ahmadi, Ali Emami, Mohsen Hajabdollahi, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Mahdi Ahmadi, Ali Emami, Mohsen Hajabdollahi, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Atefe Rajaeefar, Ali Emami, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 B conf
ICIP
Mohsen Hajabdollahi, Reza Esfandiarpoor, Kayvan Najarian, Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr
2018 J jnl
CoRR
Mohsen Hajabdollahi, Reza Esfandiarpoor, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Mohsen Hajabdollahi, Reza Esfandiarpoor, Elyas Sabeti, Nader Karimi, Kayvan Najarian, S. M. Reza Soroushmehr, Shadrokh Samavi
2018 conf
EMBC
Mojtaba Akbari, Majid Mohrekesh, Ebrahim Nasr-Esfahani, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
Multim. Tools Appl.
Maryam Karimi, Shadrokh Samavi, Nader Karimi, S. M. Reza Soroushmehr, Weisi Lin, Kayvan Najarian
2018 J jnl
CoRR
Mahdi Ahmadi, Alireza Norouzi, S. M. Reza Soroushmehr, Nader Karimi, Kayvan Najarian, Shadrokh Samavi, Ali Emami
2018 J jnl
Int. J. Circuit Theory Appl.
Mohsen Hajabdollahi, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2018 conf
EMBC
Hamidreza Zarrabi, Mohsen Hajabdollahi, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Hamidreza Zarrabi, Mohsen Hajabdollahi, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
Multim. Tools Appl.
Elham Etemad, Shadrokh Samavi, S. M. Reza Soroushmehr, Nader Karimi, Mohammad Etemad, Shahram Shirani, Kayvan Najarian
2018 J jnl
CoRR
Mohsen Hajabdollahi, Reza Esfandiarpoor, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2018 J jnl
CoRR
Mohsen Hajabdollahi, Reza Esfandiarpoor, Pejman Khadivi, S. M. Reza Soroushmehr, Nader Karimi, Kayvan Najarian, Shadrokh Samavi
2018 J jnl
Biomed. Signal Process. Control.
Ebrahim Nasr-Esfahani, Nader Karimi, Mohammad H. Jafari, S. Mohamad R. Soroushmehr, Shadrokh Samavi, Brahmajee K. Nallamothu, Kayvan Najarian
2018 J jnl
Medical Biol. Eng. Comput.
Hamid R. Fazlali, Nader Karimi, S. M. Reza Soroushmehr, Shahram Shirani, Brahmajee K. Nallamothu, Kevin R. Ward, Shadrokh Samavi, Kayvan Najarian
2017 J jnl
CoRR
M. Amin Khorsandi, Nader Karimi, Shadrokh Samavi
2017 conf
EMBC
Nasrin Tavakoli, Maryam Karimi, Mansour Nejati, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2017 J jnl
CoRR
Maedeh Jamali, Shima Rafiee, S. M. Reza Soroushmehr, Nader Karimi, Shahram Shirani, Kayvan Najarian, Shadrokh Samavi
2017 J jnl
CoRR
Zohreh HosseinKhani, Mohsen Hajabdollahi, Nader Karimi, S. Mohamad R. Soroushmehr, Shahram Shirani, Kayvan Najarian, Shadrokh Samavi
2017 J jnl
Multim. Tools Appl.
Hamid R. Fazlali, Shadrokh Samavi, Nader Karimi, Shahram Shirani
2017 J jnl
CoRR
Maryam Karimi, Najmeh Soltanian, Shadrokh Samavi, Nader Karimi, S. M. Reza Soroushmehr, Kayvan Najarian
2017 J jnl
IEEE Trans. Multim.
Maryam Karimi, Mansour Nejati, S. M. Reza Soroushmehr, Shadrokh Samavi, Nader Karimi, Kayvan Najarian
2017 J jnl
CoRR
Ebrahim Nasr-Esfahani, Shima Rafiee, Mohammad H. Jafari, Nader Karimi, James S. Wrobel, S. M. Reza Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2017 J jnl
Int. J. Comput. Assist. Radiol. Surg.
M. Hossein Jafari, Ebrahim Nasr-Esfahani, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2017 B conf
ICIP
Mansour Nejati, Maryam Karimi, S. M. Reza Soroushmehr, Nader Karimi, Shadrokh Samavi, Kayvan Najarian
2017 J jnl
Multim. Tools Appl.
M. Heidari, Shadrokh Samavi, S. Mohamad R. Soroushmehr, Shahram Shirani, Nader Karimi, Kayvan Najarian
2017 J jnl
CoRR
Farshad Kheiri, Shadrokh Samavi, Nader Karimi
2017 J jnl
CoRR
Majid Mohrekesh, Shekoofeh Azizi, Shahram Shirani, Nader Karimi, Shadrokh Samavi
2017 J jnl
Signal Process. Image Commun.
F. Shafieyan, Nader Karimi, Behzad Mirmahboub, Shadrokh Samavi, Shahram Shirani
2017 J jnl
Entropy
Lilian Govone, Mohsen Torabi, Graeme Hunt, Nader Karimi
2017 J jnl
CoRR
Mohammad Amin Khorsandi, Nader Karimi, Shadrokh Samavi
2017 J jnl
J. Vis. Commun. Image Represent.
Maryam Karimi, Shadrokh Samavi, Nader Karimi, S. M. Reza Soroushmehr, Weisi Lin, Kayvan Najarian
2017 J jnl
CoRR
Zohreh HosseinKhani, Mohsen Hajabdollahi, Nader Karimi, S. M. Reza Soroushmehr, Shahram Shirani, Shadrokh Samavi, Kayvan Najarian
2017 J jnl
Inf. Fusion
Mansour Nejati, Shadrokh Samavi, Nader Karimi, S. M. Reza Soroushmehr, Shahram Shirani, Iman Roosta, Kayvan Najarian
2017 J jnl
CoRR
Hamid R. Fazlali, Nader Karimi, S. M. Reza Soroushmehr, Shahram Shirani, Brahmajee K. Nallamothu, Kevin R. Ward, Shadrokh Samavi, Kayvan Najarian
2016 conf
EMBC
Mohammad H. Jafari, Shadrokh Samavi, Nader Karimi, S. Mohamad R. Soroushmehr, Kevin Ward, Kayvan Najarian
2016 conf
EMBC
Mahsa Kadkhodaei, Shadrokh Samavi, Nader Karimi, Hoda Mohaghegh, S. Mohamad R. Soroushmehr, Kevin Ward, Angelo All, Kayvan Najarian
2016 J jnl
IEEE Trans. Image Process.
Mansour Nejati, Shadrokh Samavi, Nader Karimi, S. Mohamad R. Soroushmehr, Kayvan Najarian
2016 Misc conf
ICASSP
Mansour Nejati, Shadrokh Samavi, Nader Karimi, S. M. Reza Soroushmehr, Kayvan Najarian
2016 Misc conf
ICASSP
Hoda Mohaghegh, Shadrokh Samavi, Nader Karimi, S. Mohamad R. Soroushmehr, Kayvan Najarian
2016 J jnl
CoRR
Mohammad H. Jafari, Ebrahim Nasr-Esfahani, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2016 J jnl
CoRR
Ebrahim Nasr-Esfahani, Nader Karimi, S. M. Reza Soroushmehr, M. Hossein Jafari, M. Amin Khorsandi, Shadrokh Samavi, Kayvan Najarian
2016 conf
EMBC
M. Amin Khorsandi, Nader Karimi, Shadrokh Samavi, Mohsen Hajabdollahi, S. Mohamad R. Soroushmehr, Kevin Ward, Kayvan Najarian
2016 conf
EMBC
Ebrahim Nasr-Esfahani, Shadrokh Samavi, Nader Karimi, S. Mohamad R. Soroushmehr, Mohammad H. Jafari, Kevin Ward, Kayvan Najarian
2016 B conf
ICPR
M. Amin Khorsandi, Nader Karimi, S. Mohamad R. Soroushmehr, Mohsen Hajabdollahi, Shadrokh Samavi, Kevin Ward, Kayvan Najarian
2016 B conf
ICPR
Zohreh HosseinKhani, Nader Karimi, S. Mohamad R. Soroushmehr, Mohsen Hajabdollahi, Shadrokh Samavi, Kevin Ward, Kayvan Najarian
2016 conf
EMBC
Maedeh Jamali, Shadrokh Samavi, Nader Karimi, S. Mohamad R. Soroushmehr, Kevin Ward, Kayvan Najarian
2016 B conf
ICIP
Mohammad H. Jafari, Shadrokh Samavi, S. Mohamad R. Soroushmehr, Hoda Mohaghegh, Nader Karimi, Kayvan Najarian
2016 B conf
ICPR
Hoda Mohaghegh, Nader Karimi, S. Mohamad R. Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2016 B conf
ICPR
Mohammad H. Jafari, Nader Karimi, Ebrahim Nasr-Esfahani, Shadrokh Samavi, S. Mohamad R. Soroushmehr, Kevin R. Ward, Kayvan Najarian
2016 J jnl
Circuits Syst. Signal Process.
Seyed Mohammad Ali Zeinolabedin, Nader Karimi, Shadrokh Samavi, Tony Tae-Hyoung Kim
2016 J jnl
Expert Syst. Appl.
Nader Karimi, Shadrokh Samavi, S. M. Reza Soroushmehr, Shahram Shirani, Kayvan Najarian
2016 conf
EMBC
Ebrahim Nasr-Esfahani, Shadrokh Samavi, Nader Karimi, S. M. Reza Soroushmehr, Kevin Ward, Mohammad H. Jafari, Banafsheh Felfeliyan, Brahmajee K. Nallamothu, Kayvan Najarian
2016 B conf
ICIP
Banafsheh Felfelian, Hamid R. Fazlali, Nader Karimi, S. Mohamad R. Soroushmehr, Shadrokh Samavi, Brahmajee K. Nallamothu, Kayvan Najarian
2015 conf
EMBC
Hoda Mohaghegh, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2015 B conf
ICIP
Salome Kazeminia, Nader Karimi, Behzad Mirmahboub, S. Mohamad R. Soroushmehr, Shadrokh Samavi, Kayvan Najarian
2015 B conf
ICIP
Iman Roosta, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2015 J jnl
Comput. Stand. Interfaces
Nader Karimi, Shadrokh Samavi, Shahram Shirani, Anahita Banaei, Ebrahim Nasr-Esfahani
2015 conf
EMBC
Salome Kazeminia, Nader Karimi, S. M. Reza Soroushmehr, Shadrokh Samavi, Harm Derksen, Kayvan Najarian
2015 conf
EMBC
Hamid R. Fazlali, Nader Karimi, S. Mohamad R. Soroushmehr, Shadrokh Samavi, Brahmajee K. Nallamothu, Harm Derksen, Kayvan Najarian
2015 J jnl
Multim. Tools Appl.
Nader Karimi, Shadrokh Samavi, Somaieh Amraee, Shahram Shirani
2015 B conf
ICIP
Hamid R. Fazlali, Nader Karimi, S. Mohamad R. Soroushmehr, S. Sinha, Shadrokh Samavi, Brahmajee K. Nallamothu, Kayvan Najarian
2014 B conf
ICIP
F. Shafieyan, Nader Karimi, Behzad Mirmahboub, Shadrokh Samavi, Shahram Shirani
2014 conf
ISCISC
Sepideh Akhavan Bitaghsir, Nader Karimi, Shekoofeh Azizi, Shadrokh Samavi
2013 J jnl
IEEE Trans. Biomed. Eng.
Behzad Mirmahboub, Shadrokh Samavi, Nader Karimi, Shahram Shirani
2013 J jnl
IEEE J. Biomed. Health Informatics
Nader Karimi, Shadrokh Samavi, Shahram Shirani
2012 conf
ICC
Hoda Rezaee Kaviani, Shadrokh Samavi, Nader Karimi, Shahram Shirani
2012 A conf
ICME
Behzad Mirmahboub, Shadrokh Samavi, Nader Karimi, Shahram Shirani
2011 A conf
ICME
Somaieh Amraee, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2010 Misc conf
ICASSP
Nader Karimi, Shadrokh Samavi, Shahram Shirani
2010 A conf
ICME
Hossein Talebi Esfandarani, Nader Karimi, Shadrokh Samavi, Shahram Shirani
2009 conf
CCECE
Nader Karimi, Shadrokh Samavi, Shahram Shirani, Somaieh Amraee, Zahra Safaryazdi, Elham Mahmoodzadeh
2009 conf
CCECE
Nader Karimi, Shadrokh Samavi, Shahram Shirani, Hossein Talebi Esfandarani, Seyed Mohammad Ali Zaynolabedin
2009 conf
CCECE
Majid Mohrekesh, Shadrokh Samavi, Nader Karimi, Shahram Shirani, Parisa Behnamfar
2008 Misc conf
ICASSP
Ebrahim Nasr-Esfahani, Shadrokh Samavi, Nader Karimi, Shahram Shirani
2007 conf
ICIP (2)
Abbas Neekabadi, Shadrokh Samavi, S. A. Razavi, Nader Karimi, Shahram Shirani
2007 conf
ICIP (4)
Ebrahim Nasr-Esfahani, Shadrokh Samavi, Nader Karimi, Shahram Shirani
2006 J jnl
IEEE Trans. Image Process.
Shadrokh Samavi, Shahram Shirani, Nader Karimi
2004 J jnl
J. VLSI Signal Process.
Shadrokh Samavi, Shahram Shirani, Nader Karimi, M. Jamal Deen
tests/unit/test_decompile_analysis.py
← Index tests/unit/test_decompile_analysis.py python
"""Unit tests (mocked Binary Ninja) for analysis modules:
- bninja/analysis/cfg.py — CFGAnalysis
- bninja/analysis/disassembly.py — DisassemblyAnalysis
- bninja/analysis/low_level.py — LowLevelAnalysis
"""
import sys
import pytest
from unittest.mock import MagicMock

from tests.unit.conftest_binja_stubs import (
    install_binja_stubs,
    BranchType,
    InstructionTextTokenType,
    MockBasicBlock,
    MockEdge,
    MockFunction,
    MockToken,
    MockDisassemblyLine,
    MockBinaryView,
    MockSymbol,
    SymbolType,
    LowLevelILOperation,
)

install_binja_stubs()

from redb.extractors.decompiler.bninja.analysis.cfg import CFGAnalysis
from redb.extractors.decompiler.bninja.analysis.disassembly import DisassemblyAnalysis
from redb.extractors.decompiler.bninja.arch.x86 import Arch_x86


# ============================================================================
# 9a. CFGAnalysis
# ============================================================================


class TestCFGCyclomaticComplexity:
    def test_cyclomatic_complexity_linear(self):
        """Single block, no edges: E - N + 2 = 0 - 1 + 2 = 1."""
        block = MockBasicBlock(start=0x1000, end=0x1010, outgoing_edges=[])
        func = MockFunction(start=0x1000, basic_blocks=[block])
        cfg = CFGAnalysis(func)
        result = cfg.extract_function_cfg()
        assert result["cyclomatic_complexity"] == 1

    def test_cyclomatic_complexity_branch(self):
        """Diamond: 4 blocks, 4 edges -> 4 - 4 + 2 = 2."""
        entry = MockBasicBlock(start=0x1000, end=0x1010)
        true_b = MockBasicBlock(start=0x1010, end=0x1020)
        false_b = MockBasicBlock(start=0x1020, end=0x1030)
        merge = MockBasicBlock(start=0x1030, end=0x1040)

        entry.outgoing_edges = [MockEdge(target=true_b), MockEdge(target=false_b)]
        true_b.outgoing_edges = [MockEdge(target=merge)]
        false_b.outgoing_edges = [MockEdge(target=merge)]
        merge.outgoing_edges = []

        func = MockFunction(start=0x1000, basic_blocks=[entry, true_b, false_b, merge])
        cfg = CFGAnalysis(func)
        result = cfg.extract_function_cfg()
        assert result["cyclomatic_complexity"] == 2

    def test_cyclomatic_complexity_loop(self):
        """Loop: 3 blocks, 3 edges -> 3 - 3 + 2 = 2."""
        header = MockBasicBlock(start=0x1000, end=0x1010)
        body = MockBasicBlock(start=0x1010, end=0x1020)
        exit_b = MockBasicBlock(start=0x1020, end=0x1030)

        header.outgoing_edges = [MockEdge(target=body), MockEdge(target=exit_b)]
        body.outgoing_edges = [MockEdge(target=header)]
        exit_b.outgoing_edges = []

        func = MockFunction(start=0x1000, basic_blocks=[header, body, exit_b])
        cfg = CFGAnalysis(func)
        result = cfg.extract_function_cfg()
        assert result["cyclomatic_complexity"] == 2


class TestCFGExtractFunctionCFG:
    def _make_simple_cfg(self):
        """Create a simple two-block CFG for testing structure."""
        entry = MockBasicBlock(start=0x1000, end=0x1010)
        exit_b = MockBasicBlock(start=0x1010, end=0x1020)

        entry.outgoing_edges = [MockEdge(source=entry, target=exit_b, edge_type=BranchType.UnconditionalBranch)]
        exit_b.incoming_edges = [MockEdge(source=entry, target=exit_b)]
        exit_b.outgoing_edges = []
        entry.incoming_edges = []

        func = MockFunction(start=0x1000, basic_blocks=[entry, exit_b])
        return func

    def test_extract_function_cfg_structure(self):
        func = self._make_simple_cfg()
        cfg = CFGAnalysis(func)
        result = cfg.extract_function_cfg()
        assert "function_address" not in result
        # New schema: no "blocks" or "measures" nesting
        assert "blocks" not in result
        assert "measures" not in result

    def test_function_cfg_new_keys(self):
        """Assert all expected keys are present in the new output dict."""
        func = self._make_simple_cfg()
        cfg = CFGAnalysis(func)
        result = cfg.extract_function_cfg()
        expected_keys = [
            "cfg_topology_hash",
            "block_count",
            "edge_count",
            "llil_total_operations",
            "call_count",
            "cyclomatic_complexity",
            "loop_count",
            "max_depth",
            "max_fan_out",
            "md_index_topdown",
            "md_index_bottomup",
            "prime_product_llil",
            "cfg_feature_tlsh",
            "wl_minhash",
            "bb_features",
            "cfg_adjacency",
        ]
        for key in expected_keys:
            assert key in result, f"Missing key: {key}"

    def test_returns_none_for_empty_blocks(self):
        func = MockFunction(start=0x1000, basic_blocks=[])
        cfg = CFGAnalysis(func)
        assert cfg.extract_function_cfg() is None


class TestCFGTopologyHash:
    def _make_two_block_cfg(self):
        entry = MockBasicBlock(start=0x1000, end=0x1010)
        exit_b = MockBasicBlock(start=0x1010, end=0x1020)
        entry.outgoing_edges = [MockEdge(target=exit_b)]
        exit_b.outgoing_edges = []
        return MockFunction(start=0x1000, basic_blocks=[entry, exit_b])

    def test_topology_hash_is_16_bytes(self):
        func = self._make_two_block_cfg()
        cfg = CFGAnalysis(func)
        result = cfg.extract_function_cfg()
        assert isinstance(result["cfg_topology_hash"], bytes)
        assert len(result["cfg_topology_hash"]) == 16

    def test_topology_hash_deterministic(self):
        func = self._make_two_block_cfg()
        r1 = CFGAnalysis(func).extract_function_cfg()
        r2 = CFGAnalysis(func).extract_function_cfg()
        assert r1["cfg_topology_hash"] == r2["cfg_topology_hash"]


class TestCFGLoopCount:
    def test_no_loops(self):
        entry = MockBasicBlock(start=0x1000, end=0x1010)
        exit_b = MockBasicBlock(start=0x1010, end=0x1020)
        entry.outgoing_edges = [MockEdge(target=exit_b)]
        exit_b.outgoing_edges = []
        func = MockFunction(start=0x1000, basic_blocks=[entry, exit_b])
        result = CFGAnalysis(func).extract_function_cfg()
        assert result["loop_count"] == 0

    def test_single_loop(self):
        header = MockBasicBlock(start=0x1000, end=0x1010)
        body = MockBasicBlock(start=0x1010, end=0x1020)
        exit_b = MockBasicBlock(start=0x1020, end=0x1030)
        header.outgoing_edges = [MockEdge(target=body), MockEdge(target=exit_b)]
        body.outgoing_edges = [MockEdge(target=header)]
        exit_b.outgoing_edges = []
        func = MockFunction(start=0x1000, basic_blocks=[header, body, exit_b])
        result = CFGAnalysis(func).extract_function_cfg()
        assert result["loop_count"] == 1


class TestCFGMaxDepth:
    def test_max_depth_linear(self):
        entry = MockBasicBlock(start=0x1000, end=0x1010)
        b1 = MockBasicBlock(start=0x1010, end=0x1020)
        b2 = MockBasicBlock(start=0x1020, end=0x1030)
        entry.outgoing_edges = [MockEdge(target=b1)]
        b1.outgoing_edges = [MockEdge(target=b2)]
        b2.outgoing_edges = []
        func = MockFunction(start=0x1000, basic_blocks=[entry, b1, b2])
        result = CFGAnalysis(func).extract_function_cfg()
        assert result["max_depth"] == 2

    def test_max_depth_single_block(self):
        block = MockBasicBlock(start=0x1000, end=0x1010, outgoing_edges=[])
        func = MockFunction(start=0x1000, basic_blocks=[block])
        result = CFGAnalysis(func).extract_function_cfg()
        assert result["max_depth"] == 0


class TestCFGCollectBlockLlilOps:
    """Test that _collect_block_llil_ops correctly maps LLIL data to native blocks."""

    def test_llil_fields_nonzero_with_mock_llil(self):
        """When LLIL is available, llil_total_operations and call_count should be non-zero."""
        # Two native blocks
        entry = MockBasicBlock(start=0x1000, end=0x1010)
        exit_b = MockBasicBlock(start=0x1010, end=0x1020)
        entry.outgoing_edges = [MockEdge(target=exit_b)]
        exit_b.outgoing_edges = []

        # LLIL instructions: SET_REG, CALL in first block; STORE, RET in second
        llil_instrs_1 = [
            MockLLILInstruction(LowLevelILOperation.LLIL_SET_REG),
            MockLLILInstruction(LowLevelILOperation.LLIL_CALL),
        ]
        llil_instrs_2 = [
            MockLLILInstruction(LowLevelILOperation.LLIL_STORE),
            MockLLILInstruction(LowLevelILOperation.LLIL_RET),
        ]

        # LLIL basic blocks map back to native blocks via source_block
        llil_bb1 = MockLLILBasicBlock(llil_instrs_1, source_block=entry)
        llil_bb2 = MockLLILBasicBlock(llil_instrs_2, source_block=exit_b)
        llil_func = MockLLILFunction([llil_bb1, llil_bb2])

        func = MockFunction(start=0x1000, basic_blocks=[entry, exit_b], llil=llil_func)
        result = CFGAnalysis(func, llil_function=llil_func).extract_function_cfg()

        assert result["llil_total_operations"] == 4
        assert result["call_count"] == 1
        assert result["prime_product_llil"] != 0

    def test_llil_none_gives_zero_fields(self):
        """Without LLIL, LLIL-dependent fields should be zero."""
        block = MockBasicBlock(start=0x1000, end=0x1010, outgoing_edges=[])
        func = MockFunction(start=0x1000, basic_blocks=[block])
        result = CFGAnalysis(func).extract_function_cfg()

        assert result["llil_total_operations"] == 0
        assert result["call_count"] == 0
        assert result["prime_product_llil"] == 0

    def test_bb_features_with_llil(self):
        """bb_features should reflect LLIL instruction categories when LLIL is available."""
        block = MockBasicBlock(start=0x1000, end=0x1010, outgoing_edges=[])

        llil_instrs = [
            MockLLILInstruction(LowLevelILOperation.LLIL_ADD),
            MockLLILInstruction(LowLevelILOperation.LLIL_LOAD),
            MockLLILInstruction(LowLevelILOperation.LLIL_CALL),
        ]
        llil_bb = MockLLILBasicBlock(llil_instrs, source_block=block)
        llil_func = MockLLILFunction([llil_bb])

        func = MockFunction(start=0x1000, basic_blocks=[block])
        result = CFGAnalysis(func, llil_function=llil_func).extract_function_cfg()

        feats = result["bb_features"]
        assert len(feats) == 1
        assert feats[0][0] == 3  # instruction count = 3
        # At least one non-zero category count (not all OTHER)
        category_counts = feats[0][1:7]
        assert sum(category_counts) > 0


# ============================================================================
# 9b. DisassemblyAnalysis
# ============================================================================


class TestDisassemblyAnalysisGetJson:
    def _make_analysis(self, instructions=None, basic_blocks=None):
        arch = Arch_x86()
        if instructions is None:
            instructions = [
                (
                    [
                        MockToken("push", InstructionTextTokenType.InstructionToken),
                        MockToken(" ", InstructionTextTokenType.TextToken),
                        MockToken("rbp", InstructionTextTokenType.RegisterToken),
                    ],
                    0x1000,
                ),
                (
                    [
                        MockToken("mov", InstructionTextTokenType.InstructionToken),
                        MockToken(" ", InstructionTextTokenType.TextToken),
                        MockToken("rsp", InstructionTextTokenType.RegisterToken),
                    ],
                    0x1003,
                ),
            ]
        if basic_blocks is None:
            basic_blocks = [MockBasicBlock(
                start=0x1000, end=0x1010,
                disassembly_text=[MockDisassemblyLine([MockToken("push rbp")])]
            )]

        func = MockFunction(
            name="test_func",
            start=0x1000,
            basic_blocks=basic_blocks,
            instructions=instructions,
            symbol=MockSymbol(symbol_type=SymbolType.FunctionSymbol, name="test_func"),
            stack_adjustment=MagicMock(value=-8),
            mlil=None,
        )
        bv = MockBinaryView()
        logger = MagicMock()
        return DisassemblyAnalysis(arch, func, bv, logger)

    def test_get_json_basic_structure(self):
        da = self._make_analysis()
        result, errors = da.get_json()
        expected_keys = [
            "disassembled_function_hash",
            "disassembled_function",
            "disassembled_function_no_addresses",
            "disassembled_function_name",
            "disassembled_function_address",
            "instructions_count",
            "function_type",
            "instructions_types",
            "control_flow_count",
            "memory_access_pattern",
            "register_usage",
            "data_references_count",
        ]
        for key in expected_keys:
            assert key in result, f"Missing key: {key}"

    def test_get_json_hash_deterministic(self):
        da = self._make_analysis()
        r1, _ = da.get_json()
        da2 = self._make_analysis()
        r2, _ = da2.get_json()
        assert r1["disassembled_function_hash"] == r2["disassembled_function_hash"]


class TestDisassemblyCollectInstructionTypes:
    def test_collect_instruction_types(self):
        arch = Arch_x86()
        instructions = [
            ([MockToken("MOV", InstructionTextTokenType.InstructionToken)], 0x1000),
            ([MockToken("ADD", InstructionTextTokenType.InstructionToken)], 0x1001),
            ([MockToken("MOV", InstructionTextTokenType.InstructionToken)], 0x1002),
        ]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        types = da.collect_instruction_types()
        assert "DATA_MOVEMENT" in types
        assert "ARITHMETIC" in types

    def test_collect_instruction_types_empty(self):
        arch = Arch_x86()
        func = MockFunction(start=0x1000, instructions=[], symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        types = da.collect_instruction_types()
        assert types == {}


class TestDisassemblyMemoryPatterns:
    def _make_memory_instruction(self, tokens):
        return ([t for t in tokens], 0x1000)

    def test_collect_memory_patterns_stack(self):
        arch = Arch_x86()
        tokens = [
            MockToken("[", InstructionTextTokenType.BeginMemoryOperandToken),
            MockToken("RSP", InstructionTextTokenType.RegisterToken),
            MockToken("+0x8", InstructionTextTokenType.TextToken),
            MockToken("]", InstructionTextTokenType.EndMemoryOperandToken),
        ]
        instructions = [self._make_memory_instruction(tokens)]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        patterns = da.collect_memory_patterns()
        assert "MEM_STACK" in patterns

    def test_collect_memory_patterns_direct(self):
        arch = Arch_x86()
        tokens = [
            MockToken("[", InstructionTextTokenType.BeginMemoryOperandToken),
            MockToken("0x402000", InstructionTextTokenType.TextToken),
            MockToken("]", InstructionTextTokenType.EndMemoryOperandToken),
        ]
        instructions = [self._make_memory_instruction(tokens)]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        patterns = da.collect_memory_patterns()
        assert "MEM_DIRECT" in patterns

    def test_collect_memory_patterns_scaled(self):
        arch = Arch_x86()
        tokens = [
            MockToken("[", InstructionTextTokenType.BeginMemoryOperandToken),
            MockToken("RAX+RCX*4", InstructionTextTokenType.TextToken),
            MockToken("]", InstructionTextTokenType.EndMemoryOperandToken),
        ]
        instructions = [self._make_memory_instruction(tokens)]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        patterns = da.collect_memory_patterns()
        assert "MEM_SCALED_INDEX" in patterns

    def test_collect_memory_patterns_base_offset(self):
        arch = Arch_x86()
        tokens = [
            MockToken("[", InstructionTextTokenType.BeginMemoryOperandToken),
            MockToken("RAX+0x10", InstructionTextTokenType.TextToken),
            MockToken("]", InstructionTextTokenType.EndMemoryOperandToken),
        ]
        instructions = [self._make_memory_instruction(tokens)]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        patterns = da.collect_memory_patterns()
        assert "MEM_BASE_OFFSET" in patterns


class TestDisassemblyRegisterUsage:
    def test_collect_register_usage_gpr(self):
        arch = Arch_x86()
        instructions = [
            ([MockToken("RAX", InstructionTextTokenType.RegisterToken)], 0x1000),
        ]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        regs = da.collect_register_usage()
        assert "GPR" in regs

    def test_collect_register_usage_simd(self):
        arch = Arch_x86()
        instructions = [
            ([MockToken("XMM0", InstructionTextTokenType.RegisterToken)], 0x1000),
        ]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        regs = da.collect_register_usage()
        assert "SIMD" in regs

    def test_collect_register_usage_fpu(self):
        arch = Arch_x86()
        instructions = [
            ([MockToken("ST0", InstructionTextTokenType.RegisterToken)], 0x1000),
        ]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        regs = da.collect_register_usage()
        assert "FPU" in regs


class TestDisassemblyMisc:
    def test_count_data_references(self):
        arch = Arch_x86()
        func = MockFunction(start=0x1000, instructions=[], symbol=MockSymbol(), mlil=None)
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        assert da.count_data_references() == 0

    def test_compute_max_block_size(self):
        arch = Arch_x86()
        blocks = [
            MockBasicBlock(disassembly_text=[MockDisassemblyLine([]) for _ in range(3)]),
            MockBasicBlock(disassembly_text=[MockDisassemblyLine([]) for _ in range(5)]),
        ]
        func = MockFunction(start=0x1000, basic_blocks=blocks, instructions=[], symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        assert da.compute_max_block_size() == 5

    def test_compute_num_calls(self):
        arch = Arch_x86()
        instructions = [
            ([MockToken("CALL", InstructionTextTokenType.InstructionToken)], 0x1000),
            ([MockToken("MOV", InstructionTextTokenType.InstructionToken)], 0x1005),
            ([MockToken("CALL", InstructionTextTokenType.InstructionToken)], 0x1010),
        ]
        func = MockFunction(start=0x1000, instructions=instructions, symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        assert da.compute_num_calls() == 2

    def test_estimate_stack_size_value(self):
        arch = Arch_x86()
        stack = MagicMock()
        stack.value = -16
        func = MockFunction(start=0x1000, instructions=[], symbol=MockSymbol(), stack_adjustment=stack)
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        assert da.estimate_stack_size() == -16

    def test_estimate_stack_size_int(self):
        arch = Arch_x86()
        func = MockFunction(start=0x1000, instructions=[], symbol=MockSymbol(), stack_adjustment=-8)
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        assert da.estimate_stack_size() == -8

    def test_normalize_opcode(self):
        arch = Arch_x86()
        func = MockFunction(start=0x1000, instructions=[], symbol=MockSymbol())
        da = DisassemblyAnalysis(arch, func, MockBinaryView(), MagicMock())
        assert da.normalize_opcode("mov") == "MOV"
        assert da.normalize_opcode("PUSH") == "PUSH"


# ============================================================================
# 9c. LowLevelAnalysis (basic tests with mocked LLIL)
# ============================================================================


class MockLLILInstruction:
    """Mock LLIL instruction for low_level.py tests."""
    def __init__(self, operation, operands=None, address=0):
        self.operation = operation
        self.operands = operands or []
        self.address = address

    def __str__(self):
        return f"LLIL_{self.operation}"


class MockLLILBasicBlock:
    def __init__(self, instructions, source_block=None):
        self._instructions = instructions
        self.source_block = source_block

    def __iter__(self):
        return iter(self._instructions)


class MockLLILFunction:
    def __init__(self, basic_blocks):
        self.basic_blocks = basic_blocks
        self._instructions = []
        for bb in basic_blocks:
            self._instructions.extend(bb._instructions)

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def source_function(self):
        mock = MagicMock()
        mock.start = 0x1000
        return mock


class TestLowLevelAnalysisCountControlFlow:
    def test_count_control_flow_instructions(self):
        from redb.extractors.decompiler.bninja.analysis.low_level import LowLevelAnalysis
        instrs = [
            MockLLILInstruction(LowLevelILOperation.LLIL_IF),
            MockLLILInstruction(LowLevelILOperation.LLIL_SET_REG),
            MockLLILInstruction(LowLevelILOperation.LLIL_CALL),
            MockLLILInstruction(LowLevelILOperation.LLIL_GOTO),
        ]
        bb = MockLLILBasicBlock(instrs)
        llil_func = MockLLILFunction([bb])

        func = MockFunction(start=0x1000, llil=llil_func, symbol=MockSymbol())
        func.low_level_il = None
        bv = MockBinaryView()
        bv.arch = MagicMock()
        bv.arch.stack_pointer = "sp"
        la = LowLevelAnalysis(func, bv, MagicMock())
        assert la.count_control_flow_instructions() == 3  # IF, CALL, GOTO


class TestLowLevelAnalysisNumCalls:
    def test_compute_num_calls_llil(self):
        from redb.extractors.decompiler.bninja.analysis.low_level import LowLevelAnalysis
        instrs = [
            MockLLILInstruction(LowLevelILOperation.LLIL_CALL),
            MockLLILInstruction(LowLevelILOperation.LLIL_TAILCALL),
            MockLLILInstruction(LowLevelILOperation.LLIL_SET_REG),
        ]
        bb = MockLLILBasicBlock(instrs)
        llil_func = MockLLILFunction([bb])

        func = MockFunction(start=0x1000, llil=llil_func, symbol=MockSymbol())
        func.low_level_il = None
        bv = MockBinaryView()
        la = LowLevelAnalysis(func, bv, MagicMock())
        assert la.compute_num_calls() == 2


class TestLowLevelAnalysisCollectNormalization:
    def test_collect_low_level(self):
        from redb.extractors.decompiler.bninja.analysis.low_level import LowLevelAnalysis
        instrs = [
            MockLLILInstruction(LowLevelILOperation.LLIL_SET_REG, address=0x1000),
            MockLLILInstruction(LowLevelILOperation.LLIL_STORE, address=0x1004),
        ]
        bb = MockLLILBasicBlock(instrs)
        llil_func = MockLLILFunction([bb])

        func = MockFunction(start=0x1000, llil=llil_func, symbol=MockSymbol())
        func.low_level_il = None
        bv = MockBinaryView()
        la = LowLevelAnalysis(func, bv, MagicMock())
        result, _ = la._collect_low_level_and_with_addr()
        assert len(result) == 2
        # Each item is a list of operation ints
        assert isinstance(result[0], list)

    def test_collect_low_level_with_addr_offset_clamping(self):
        from redb.extractors.decompiler.bninja.analysis.low_level import LowLevelAnalysis
        instrs = [
            MockLLILInstruction(LowLevelILOperation.LLIL_SET_REG, address=0x0FFF),  # Before function start
        ]
        bb = MockLLILBasicBlock(instrs)
        llil_func = MockLLILFunction([bb])

        func = MockFunction(start=0x1000, llil=llil_func, symbol=MockSymbol())
        func.low_level_il = None
        bv = MockBinaryView()
        la = LowLevelAnalysis(func, bv, MagicMock())
        _, result = la._collect_low_level_and_with_addr()
        assert len(result) == 1
        offset, _ = result[0]
        assert offset == 0  # Clamped to 0