Wei-Yen Wang

111 papers B 23C 4Misc 2Journal 54Unranked 28
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Hoangcong Le, Cheng-Kai Lu, Wei-Yen Wang, Chen-Chien James Hsu
2026 J jnl
Int. J. Fuzzy Syst.
Min-Jie Hsu, Chen-Chien Hsu, Yi-Hsing Chien, Wei-Yen Wang
2025 C conf
ICCE
Pei-Hsuan Tung, Cheng-Kai Lu, Yi-Hsing Chien, Wei-Yen Wang
2024 C conf
ICCE
Shao-Kang Huang, Chen-Chien Hsu, Wei-Yen Wang, Yin-Tien Wang
2024 conf
GCCE
Hoangcong Le, Chen-Chien Hsu, Cheng-Kai Lu, Wei-Yen Wang, Pin-Yen Monica Kuo
2024 J jnl
IEEE Access
Shao-Kang Huang, Chen-Chien James Hsu, Wei-Yen Wang
2023 J jnl
IEEE Access
Min-Jie Hsu, Po-Chao Yeh, Yi-Hsing Chien, Cheng-Kai Lu, Wei-Yen Wang, Chen-Chien James Hsu
2023 conf
ICCE-Taiwan
Yuan-Heng Lin, Yi-Hsing Chien, Min-Jie Hsu, Wei-Yen Wang, Cheng-Kai Lu, Chen-Chien Hsu
2023 C conf
ICCE
Cheng-Wei Peng, Chen-Chien Hsu, Wei-Yen Wang
2023 conf
ICCE-Taiwan
Yu-Wei Lin, Yi-Hsing Chien, Min-Jie Hsu, Wei-Yen Wang, Cheng-Kai Lu, Chen-Chien James Hsu
2022 J jnl
IEEE Access
Wei-Yen Wang, Min-Jie Hsu, Yi-Hsing Chien, Chen-Chien J. Hsu, Hsin-Han Chiang, Li-An Yu
2022 J jnl
IEEE Access
Cheng-Wei Peng, Chen-Chien J. Hsu, Wei-Yen Wang
2022 J jnl
Sensors
Shao-Kang Huang, Chen-Chien J. Hsu, Wei-Yen Wang
2022 conf
RiTA
Cheng-Wei Peng, Chen-Chien Hsu, Wei-Yen Wang, Sheng-Chung Huang
2022 J jnl
Sensors
Pin-Jui Hwang, Chen-Chien J. Hsu, Po-Yung Chou, Wei-Yen Wang, Cheng-Hung Lin
2021 conf
ICCE-TW
Chuan-Fu Hung, Yang Lin, Hao-Jheng Ciou, Wei-Yen Wang, Hsin-Han Chiang
2021 J jnl
IEEE Access
Jiun-Kai You, Chen-Chien James Hsu, Wei-Yen Wang, Shao-Kang Huang
2021 conf
ICCE-TW
Pei-Yun Hsu, Mei-Lin Huang, Wei-Yen Wang, Hsin-Han Chiang
2020 conf
ICSSE
Fang-Jing Shen, Jian-Hao Chen, Wei-Yen Wang, Dien-Lin Tsai, Lien-Chieh Shen, Ching-Tung Tseng
2020 J jnl
Int. J. Fuzzy Syst.
Min-Jie Hsu, Yi-Hsing Chien, Wei-Yen Wang, Chen-Chien James Hsu
2020 J jnl
Sensors
Cheng-Wei Peng, Chen-Chien J. Hsu, Wei-Yen Wang
2020 J jnl
IEEE Access
Wei-Yen Wang, Min-Jie Hsu, Li-An Yu, Yi-Hsing Chien, Chen-Chien J. Hsu
2020 J jnl
Sensors
Jen-Kai Tsai, Chen-Chien James Hsu, Wei-Yen Wang, Shao-Kang Huang
2020 J jnl
IEEE Consumer Electron. Mag.
Pin-Jui Hwang, Chen-Chien J. Hsu, Wei-Yen Wang
2020 J jnl
Sensors
Shao-Kang Huang, Chen-Chien James Hsu, Wei-Yen Wang, Cheng-Hung Lin
2019 Misc conf
ICMLC
Nai-Hsiang Chang, Yi-Hsing Chien, Hsin-Han Chiang, Wei-Yen Wang, Chen-Chien J. Hsu
2019 J jnl
Knowl. Eng. Rev.
Jacky Baltes, Da-Wei Kung, Wei-Yen Wang, Chen-Chien James Hsu
2019 Misc conf
ICMLC
Wen-Hsin Wang, Yi-Hsing Chien, Hsin-Han Chiang, Wei-Yen Wang, Chen-Chien James Hsu
2019 conf
ISCT
Pin-Jui Hwang, Chen-Chien James Hsu, Wei-Yen Wang
2019 J jnl
Int. J. Fuzzy Syst.
Jin-Tsong Jeng, Chen-Chia Chuang, Wei-Yen Wang, Kao-Shing Hwang
2019 conf
GCCE
Keng-Cheng Liu, Chen-Chien James Hsu, Wei-Yen Wang, Hsin-Han Chiang
2019 J jnl
IEEE Access
Cheng-Hung Lin, Wei-Yen Wang, Shen-Ho Liu, Chen-Chien James Hsu, Chiang-Heng Chien
2018 conf
GCCE
Shen-Ho Liu, Chen-Chien J. Hsu, Wei-Yen Wang, Cheng-Hung Lin
2018 J jnl
IEEE Access
Shih-An Li, Wei-Yen Wang, Wei-Zheng Pan, Chen-Chien James Hsu, Cheng-Kai Lu
2018 conf
ICCE-Berlin
Tsung-Yu Tsai, Chen-Chien J. Hsu, Hsin-Han Chiang, Wei-Yen Wang
2017 conf
RCAR
Kuan-Yu Pan, Li-Tang Hsu, Lian-Wang Lee, Hsin-Han Chiang, I-Hsum Li, Wei-Yen Wang
2017 J jnl
Robotica
Chiang-Heng Chien, Wei-Yen Wang, Jun Jo, Chen-Chien James Hsu
2017 J jnl
Int. J. Humanoid Robotics
Chen-Chien J. Hsu, Wei-Yen Wang, Tung-Yuan Lin, Yin-Tien Wang, Teng-Wei Huang
2017 conf
ICCE-Berlin
Hao Shen, Chen-Chien J. Hsu, Wei-Yen Wang, Yin-Tien Wang
2017 conf
ICCE-Berlin
Shen-Ho Liu, Chen-Chien J. Hsu, Wei-Yen Wang, Mei-Yung Chen, Yin-Tien Wang
2017 J jnl
Appl. Soft Comput.
Chiang-Heng Chien, Wei-Yen Wang, Chen-Chien J. Hsu
2016 B conf
CEC
Chen-Chien J. Hsu, Wei-Yen Wang, Yi-Hsing Chien, Ru-Yu Hou, Chin-Wang Tao
2016 conf
ICCE-Berlin
Chiang-Heng Chien, Chen-Chien J. Hsu, Wei-Yen Wang, Wen-Chung Kao, Chiang-Ju Chien
2016 conf
ICCE-Berlin
Chiang-Heng Chien, Chen-Chien J. Hsu, Wei-Yen Wang, Wen-Chung Kao, Chiang-Ju Chien
2016 J jnl
Int. J. Fuzzy Syst.
I-Hsum Li, Yi-Hsing Chien, Wei-Yen Wang, Yi-Feng Kao
2016 B conf
CEC
Chung-Ying Li, I-Hsum Li, Yi-Hsing Chien, Wei-Yen Wang, Chen-Chien J. Hsu
2016 J jnl
IEEE Trans. Fuzzy Syst.
Wei-Yen Wang, Yi-Hsing Chien, Yih-Guang Leu, Chen-Chien J. Hsu
2016 conf
ICCE-Berlin
Chiang-Heng Chien, Chen-Chien James Hsu, Wei-Yen Wang, Wen-Chung Kao, Chiang-Ju Chien
2016 J jnl
Fuzzy Sets Syst.
Yi-Hsing Chien, Wei-Yen Wang, Chen-Chien James Hsu
2015 conf
RiTA
Da-Wei Kung, Chen-Chien J. Hsu, Wei-Yen Wang, Jacky Baltes
2015 conf
ICSSE
Shun-Feng Su, Ming-Chang Chen, Yi-Hsing Chien, Wei-Yen Wang
2015 C conf
ICCE
Yan-Jhang Shih, Chen-Chien J. Hsu, Wei-Yen Wang, Yin-Tien Wang
2015 conf
ICM
Yi-Jou Wen, Chen-Chien J. Hsu, Wei-Yen Wang
2015 conf
ICCE-Berlin
Chiang-Heng Chien, Chen-Chien James Hsu, Wei-Yen Wang, Wen-Chung Kao
2015 conf
ICSSE
Yen-Cheng Kung, Chen-Chien J. Hsu, Wei-Yen Wang
2015 conf
ICNSC
Jung-Hao Peng, I-Hsum Li, Yi-Hsing Chien, Chen-Chien J. Hsu, Wei-Yen Wang
2015 J jnl
Int. J. Fuzzy Syst.
Yi-Hsing Chien, Wei-Yen Wang, Yih-Guang Leu
2015 conf
RiTA
Teng-Wei Huang, Chen-Chien J. Hsu, Wei-Yen Wang, Jacky Baltes
2015 conf
RiTA
Chun-Hsiao Yeh, Herng-Hua Chang, Chen-Chien James Hsu, Wei-Yen Wang
2015 conf
ICNSC
Chih-Wei Hsiao, Yi-Hsing Chien, Wei-Yen Wang, I-Hsum Li, Ming-Chang Chen, Shun-Feng Su
2014 B conf
SMC
Shun-Feng Su, Ming-Chang Chen, Yi-Hsing Chien, Wei-Yen Wang, Kuo-Kai Shyu
2014 J jnl
Sensors
I-Hsum Li, Ming-Chang Chen, Wei-Yen Wang, Shun-Feng Su, To-Wen Lai
2013 B conf
SMC
Chen-Chien J. Hsu, Ru-Yu Hou, Wei-Yen Wang
2013 conf
ICNSC
Wei-Yen Wang, Yi-Hsing Chien, Cheng-Kai Yang, Tsu-Tian Lee
2012 J jnl
Autom.
Wei-Yen Wang, Ming-Chang Chen, Shun-Feng Su
2012 B conf
IJCNN
I-Hsum Li, Lian-Wang Lee, Wei-Yen Wang
2011 B conf
SMC
Cheng-Lin Lee, Yih-Guang Leu, Jheng-Yi Lin, Hao-Cheng Yang, Wei-Yen Wang
2011 J jnl
IEEE Trans. Fuzzy Syst.
Wei-Yen Wang, Yi-Hsing Chien, Tsu-Tian Lee
2011 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Yi-Hsing Chien, Wei-Yen Wang, Yih-Guang Leu, Tsu-Tian Lee
2010 J jnl
Autom.
Wei-Yen Wang, Yi-Hsing Chien, Yih-Guang Leu, Tsu-Tian Lee
2010 B conf
SMC
Yi-Hsing Chien, Tsu-Tian Lee, Wei-Yen Wang
2009 B conf
SMC
Wei-Yen Wang, Ming-Chang Chen, Yi-Hsing Chien, Tsu-Tian Lee
2009 J jnl
IEEE Trans. Ind. Electron.
Wei-Yen Wang, I-Hsum Li, Ming-Chang Chen, Shun-Feng Su, Shi-Boun Hsu
2009 conf
ICARA
Ming Chih Lu, Wei-Yen Wang, Chin-Tun Chuang, Cheng-Pei Tsai, Yin-Yu Lu
2009 B conf
FUZZ-IEEE
Wei-Yen Wang, Ming-Chang Chen, Yi-Hsing Chien, Tsu-Tian Lee
2009 J jnl
Int. J. Syst. Sci.
Ping-Zong Lin, Wei-Yen Wang, Tsu-Tian Lee, Chi-Hsu Wang
2009 B conf
SMC
Wei-Yen Wang, Ming Feng Kuo, Tsu-Tian Lee, Chin-Ming Hong, Yih-Guang Leu
2009 J jnl
Neurocomputing
Yih-Guang Leu, Wei-Yen Wang, I-Hsum Li
2008 B conf
FUZZ-IEEE
Wei-Yen Wang, I-Hsum Li, Shu-Chang Li, Men-Shen Tsai, Shun-Feng Su
2008 B conf
SMC
Ming Chih Lu, Cheng-Pei Tsai, Ming-Chang Chen, Yin-Yu Lu, Wei-Yen Wang, Chen-Chien James Hsu
2008 J jnl
IEEE Trans. Ind. Electron.
Yuang-Shung Lee, Wei-Yen Wang, Tsung-Yuan Kuo
2007 B conf
SMC
Ming-Chang Chen, Wei-Yen Wang, Yi-Hsum Li, Shun-Feng Su
2007 B conf
FUZZ-IEEE
Wei-Yen Wang, Li-Chuan Chien, Yi-Hsum Li, Shun-Feng Su
2007 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Wei-Yen Wang, Ming Chih Lu, Hung Lin Kao, Chun-Yen Chu
2006 B conf
SMC
I-Hsum Li, Wei-Yen Wang, Shun-Feng Su, Ming-Chang Chen
2006 B conf
FUZZ-IEEE
Li-Hsuan Chien, Wei-Yen Wang, I-Hsum Li, Shun-Feng Su
2005 B conf
SMC
Wei-Yen Wang, I-Hsum Li, Wei-ming Wang, Shun-Feng Su, Nai-Jian Wang
2005 J jnl
IEEE Trans. Neural Networks
Yih-Guang Leu, Wei-Yen Wang, Tsu-Tian Lee
2005 B conf
SMC
Ping-Zong Lin, Wei-Yen Wang, Tsu-Tian Lee, Guan-Ming Chen
2004 J jnl
IEICE Trans. Inf. Syst.
Wei-Yen Wang, Chin-Wang Tao, Chen-Guan Chang
2004 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Wei-Yen Wang, Chih-Yuan Cheng, Yih-Guang Leu
2004 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Chin-Wang Tao, Wei-Yen Wang, M. L. Chan
2004 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Kou-Cheng Hsu, Wei-Yen Wang, Ping-Zong Lin
2003 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Wei-Yen Wang, Yi-Hsum Li
2003 J jnl
Fuzzy Sets Syst.
Wei-Yen Wang, Yih-Guang Leu, Tsu-Tian Lee
2003 B conf
SMC
Chin-Wang Tao, Mei-Lang Chan, Wei-Yen Wang
2003 B conf
SMC
Wei-Yen Wang, Guan-Ming Chen, Chin-Wang Tao
2002 B conf
FUZZ-IEEE
Wei-Yen Wang, Tsu-Tian Lee, Chen-Chian Hsu, Yi-Hsum Li
2002 B conf
IEEE Congress on Evolutionary Computation
Chen-Chien J. Hsu, Wei-Yen Wang, Chih-Yung Yu
2002 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Wei-Yen Wang, Mei-Lang Chan, Chen-Chien James Hsu, Tsu-Tian Lee
2001 B conf
SMC
Chen-Chien J. Hsu, Kai-Ming Tse, Wei-Yen Wang
2001 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Wei-Yen Wang, Yih-Guang Leu, Chen-Chien J. Hsu
2000 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Wei-Yen Wang, Mei-Lang Chan, Tsu-Tian Lee, Cheng-Hsin Liu
2000 J jnl
Int. J. Syst. Sci.
Chen-Chien James Hsu, Wei-Yen Wang
1999 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Yih-Guang Leu, Tsu-Tian Lee, Wei-Yen Wang
1999 J jnl
IEEE Trans. Robotics Autom.
Yih-Guang Leu, Wei-Yen Wang, Tsu-Tian Lee
1998 J jnl
Int. J. Syst. Sci.
Chi-Hsu Wang, Chen-Chien J. Hsu, Wei-Yen Wang
1997 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Wei-Yen Wang, Tsu-Tian Lee, Ching-Lang Liu, Chi-Hsu Wang
1997 J jnl
Int. J. Syst. Sci.
Chi-Hsu Wang, Wei-Yen Wang, Chen-Chien J. Hsu
1997 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Yih-Guang Leu, Tsu-Tian Lee, Wei-Yen Wang
1995 J jnl
IEEE Trans. Syst. Man Cybern.
Chi-Hsu Wang, Wei-Yen Wang, Tsu-Tian Lee, Pao-Shun Tseng
redb/extractors/decompiler/bninja/analysis/cfg.py
← Index redb/extractors/decompiler/bninja/analysis/cfg.py python
from binaryninja.enums import LowLevelILOperation as LLIL_OP

# Support both package and standalone imports
try:
    from . import cfg_features
except ImportError:
    from redb.extractors.decompiler.bninja.analysis import cfg_features


# ---------------------------------------------------------------------------
# Task 2.2: Build LLIL operation maps at import time using real enum values
# ---------------------------------------------------------------------------

# Prime product map: LLIL operation integer value -> small prime
cfg_features.LLIL_OP_PRIMES = {
    # SET_REG, SET_REG_SPLIT
    LLIL_OP.LLIL_SET_REG.value: 2,
    LLIL_OP.LLIL_SET_REG_SPLIT.value: 2,
    # SET_FLAG
    LLIL_OP.LLIL_SET_FLAG.value: 3,
    # LOAD
    LLIL_OP.LLIL_LOAD.value: 5,
    # STORE
    LLIL_OP.LLIL_STORE.value: 7,
    # PUSH, POP
    LLIL_OP.LLIL_PUSH.value: 11,
    LLIL_OP.LLIL_POP.value: 13,
    # CALL, TAILCALL, SYSCALL
    LLIL_OP.LLIL_CALL.value: 17,
    LLIL_OP.LLIL_TAILCALL.value: 17,
    LLIL_OP.LLIL_SYSCALL.value: 19,
    # RET, NORET
    LLIL_OP.LLIL_RET.value: 23,
    LLIL_OP.LLIL_NORET.value: 23,
    # IF, GOTO
    LLIL_OP.LLIL_IF.value: 29,
    LLIL_OP.LLIL_GOTO.value: 31,
    # ADD, SUB
    LLIL_OP.LLIL_ADD.value: 37,
    LLIL_OP.LLIL_SUB.value: 41,
    # AND, OR, XOR
    LLIL_OP.LLIL_AND.value: 43,
    LLIL_OP.LLIL_OR.value: 47,
    LLIL_OP.LLIL_XOR.value: 53,
    # LSL, LSR, ASR, ROL, ROR
    LLIL_OP.LLIL_LSL.value: 59,
    LLIL_OP.LLIL_LSR.value: 61,
    LLIL_OP.LLIL_ASR.value: 67,
    LLIL_OP.LLIL_ROL.value: 71,
    LLIL_OP.LLIL_ROR.value: 73,
    # MUL, DIVU, DIVS, MODU, MODS
    LLIL_OP.LLIL_MUL.value: 79,
    LLIL_OP.LLIL_DIVU.value: 83,
    LLIL_OP.LLIL_DIVS.value: 83,
    LLIL_OP.LLIL_MODU.value: 89,
    LLIL_OP.LLIL_MODS.value: 89,
    # NEG, NOT
    LLIL_OP.LLIL_NEG.value: 97,
    LLIL_OP.LLIL_NOT.value: 101,
    # CMP_E, CMP_NE, CMP_SLT, CMP_ULT, CMP_SLE, CMP_ULE
    # CMP_SGT, CMP_UGT, CMP_SGE, CMP_UGE
    LLIL_OP.LLIL_CMP_E.value: 103,
    LLIL_OP.LLIL_CMP_NE.value: 103,
    LLIL_OP.LLIL_CMP_SLT.value: 107,
    LLIL_OP.LLIL_CMP_ULT.value: 107,
    LLIL_OP.LLIL_CMP_SLE.value: 109,
    LLIL_OP.LLIL_CMP_ULE.value: 109,
    LLIL_OP.LLIL_CMP_SGT.value: 113,
    LLIL_OP.LLIL_CMP_UGT.value: 113,
    LLIL_OP.LLIL_CMP_SGE.value: 127,
    LLIL_OP.LLIL_CMP_UGE.value: 127,
    # NOP
    LLIL_OP.LLIL_NOP.value: 1,
    # SX, ZX, LOW_PART, BOOL_TO_INT
    LLIL_OP.LLIL_SX.value: 131,
    LLIL_OP.LLIL_ZX.value: 137,
    LLIL_OP.LLIL_LOW_PART.value: 139,
    LLIL_OP.LLIL_BOOL_TO_INT.value: 149,
    # JUMP, JUMP_TO
    LLIL_OP.LLIL_JUMP.value: 151,
    LLIL_OP.LLIL_JUMP_TO.value: 151,
}

# Category map: LLIL operation integer value -> category index
_ARITHMETIC = {
    LLIL_OP.LLIL_ADD, LLIL_OP.LLIL_ADC, LLIL_OP.LLIL_SUB, LLIL_OP.LLIL_SBB,
    LLIL_OP.LLIL_MUL, LLIL_OP.LLIL_MULU_DP, LLIL_OP.LLIL_MULS_DP,
    LLIL_OP.LLIL_DIVU, LLIL_OP.LLIL_DIVU_DP, LLIL_OP.LLIL_DIVS,
    LLIL_OP.LLIL_DIVS_DP, LLIL_OP.LLIL_MODU, LLIL_OP.LLIL_MODS,
    LLIL_OP.LLIL_NEG,
}
_LOGIC = {
    LLIL_OP.LLIL_AND, LLIL_OP.LLIL_OR, LLIL_OP.LLIL_XOR, LLIL_OP.LLIL_NOT,
    LLIL_OP.LLIL_LSL, LLIL_OP.LLIL_LSR, LLIL_OP.LLIL_ASR,
    LLIL_OP.LLIL_ROL, LLIL_OP.LLIL_RLC, LLIL_OP.LLIL_ROR, LLIL_OP.LLIL_RRC,
}
_TRANSFER = {
    LLIL_OP.LLIL_SET_REG, LLIL_OP.LLIL_SET_REG_SPLIT, LLIL_OP.LLIL_SET_FLAG,
    LLIL_OP.LLIL_GOTO, LLIL_OP.LLIL_IF, LLIL_OP.LLIL_JUMP, LLIL_OP.LLIL_JUMP_TO,
    LLIL_OP.LLIL_RET, LLIL_OP.LLIL_NORET, LLIL_OP.LLIL_PUSH, LLIL_OP.LLIL_POP,
}
_CALL = {
    LLIL_OP.LLIL_CALL, LLIL_OP.LLIL_TAILCALL, LLIL_OP.LLIL_SYSCALL,
}
_COMPARISON = {
    LLIL_OP.LLIL_CMP_E, LLIL_OP.LLIL_CMP_NE,
    LLIL_OP.LLIL_CMP_SLT, LLIL_OP.LLIL_CMP_ULT,
    LLIL_OP.LLIL_CMP_SLE, LLIL_OP.LLIL_CMP_ULE,
    LLIL_OP.LLIL_CMP_SGE, LLIL_OP.LLIL_CMP_UGE,
    LLIL_OP.LLIL_CMP_SGT, LLIL_OP.LLIL_CMP_UGT,
    LLIL_OP.LLIL_TEST_BIT, LLIL_OP.LLIL_FLAG_COND,
}
_MEMORY = {
    LLIL_OP.LLIL_LOAD, LLIL_OP.LLIL_STORE,
}

cfg_features.LLIL_OP_CATEGORIES = {}
for _op in _ARITHMETIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_ARITHMETIC
for _op in _LOGIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_LOGIC
for _op in _TRANSFER:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_TRANSFER
for _op in _CALL:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_CALL
for _op in _COMPARISON:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_COMPARISON
for _op in _MEMORY:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_MEMORY

# Set of CALL operation values for counting
_CALL_OPS = {op.value for op in _CALL}


# ---------------------------------------------------------------------------
# Task 2.1 + 2.3: Rewritten CFGAnalysis
# ---------------------------------------------------------------------------

class CFGAnalysis:
    def __init__(self, function, llil_function=None):
        self.function = function
        self.llil_function = llil_function

    def extract_function_cfg(self):
        """Extract function-level CFG features as a flat dictionary."""

        if self.function is None:
            return None

        blocks = list(self.function.basic_blocks)
        if not blocks:
            return None

        n = len(blocks)

        # 1. Build index-based adjacency from Binary Ninja blocks
        addr_to_idx = {b.start: i for i, b in enumerate(blocks)}
        successors = [[] for _ in range(n)]
        predecessors = [[] for _ in range(n)]
        for i, block in enumerate(blocks):
            for edge in block.outgoing_edges:
                if edge.target is None:
                    continue
                target_idx = addr_to_idx.get(edge.target.start)
                if target_idx is not None:
                    successors[i].append(target_idx)
                    predecessors[target_idx].append(i)

        # 2. BFS order (reusable across multiple features)
        bfs = cfg_features.bfs_order(successors, n)

        # 3. Collect per-block LLIL operations (for prime product + ACFG features)
        block_llil_ops = self._collect_block_llil_ops(blocks, addr_to_idx, n)
        all_llil_ops = [op for block_ops in block_llil_ops for op in block_ops]

        # 4. Structural counts
        edge_count = sum(len(s) for s in successors)
        total_llil = sum(len(ops) for ops in block_llil_ops)
        call_count = sum(
            1 for ops in block_llil_ops for op in ops
            if op in _CALL_OPS
        )

        # 5. Compute all features
        bb_features = cfg_features.build_block_features(block_llil_ops, successors, n)

        return {
            "cfg_topology_hash": cfg_features.compute_topology_hash(successors, bfs, n),
            "block_count": n,
            "edge_count": edge_count,
            "llil_total_operations": total_llil,
            "call_count": call_count,
            "cyclomatic_complexity": edge_count - n + 2,
            "loop_count": cfg_features.count_back_edges(successors, n),
            "max_depth": cfg_features.bfs_max_depth(successors, n),
            "max_fan_out": max((len(s) for s in successors), default=0),
            "md_index_topdown": cfg_features.compute_md_index_topdown(successors, predecessors, bfs),
            "md_index_bottomup": cfg_features.compute_md_index_bottomup(successors, predecessors, n),
            "prime_product_llil": cfg_features.compute_prime_product(all_llil_ops),
            "cfg_feature_tlsh": cfg_features.compute_cfg_feature_tlsh(bb_features, bfs),
            "wl_minhash": cfg_features.compute_wl_minhash(successors, predecessors, bb_features, n),
            "bb_features": bb_features,
            "cfg_adjacency": cfg_features.pack_adjacency(successors),
        }

    def _collect_block_llil_ops(self, blocks, addr_to_idx, n):
        """
        Collect LLIL operation integers per native basic block.
        Walks the full expression tree of each instruction so that
        nested operations (e.g. ADD inside SET_REG) are captured.
        Returns list of n lists, one per block.
        """
        block_ops = [[] for _ in range(n)]

        if self.llil_function is None:
            return block_ops

        try:
            for llil_block in self.llil_function.basic_blocks:
                # Map LLIL block to native block via source_block
                if llil_block.source_block is not None:
                    native_idx = addr_to_idx.get(llil_block.source_block.start)
                    if native_idx is not None:
                        for instr in llil_block:
                            self._walk_llil_ops(instr, block_ops[native_idx])
        except Exception:
            pass  # Return empty ops — LLIL-dependent fields will be 0/null

        return block_ops

    @staticmethod
    def _walk_llil_ops(expr, ops_list):
        """Collect operation values from an LLIL expression tree iteratively."""
        stack = [expr]
        while stack:
            node = stack.pop()
            if hasattr(node, 'operation'):
                ops_list.append(node.operation.value)
            if hasattr(node, 'operands'):
                for operand in node.operands:
                    if hasattr(operand, 'operation'):
                        stack.append(operand)