neo_solidity/
cfg.rs

1//! Control Flow Graph
2//!
3//! Represents program control flow for analysis.
4
5use std::collections::HashMap;
6
7/// Basic block
8#[derive(Debug, Clone)]
9pub struct BasicBlock {
10    pub id: usize,
11    pub predecessors: Vec<usize>,
12    pub successors: Vec<usize>,
13}
14
15/// Control flow graph
16#[derive(Default)]
17pub struct ControlFlowGraph {
18    blocks: HashMap<usize, BasicBlock>,
19    entry: Option<usize>,
20}
21
22impl ControlFlowGraph {
23    pub fn new() -> Self {
24        Self::default()
25    }
26
27    pub fn add_block(&mut self, id: usize) {
28        self.blocks.insert(
29            id,
30            BasicBlock {
31                id,
32                predecessors: Vec::new(),
33                successors: Vec::new(),
34            },
35        );
36    }
37
38    pub fn add_edge(&mut self, from: usize, to: usize) {
39        if let Some(b) = self.blocks.get_mut(&from) {
40            b.successors.push(to);
41        }
42        if let Some(b) = self.blocks.get_mut(&to) {
43            b.predecessors.push(from);
44        }
45    }
46
47    pub fn set_entry(&mut self, id: usize) {
48        self.entry = Some(id);
49    }
50}