Skip to content
Snippets Groups Projects
ir.rs 3.75 KiB
Newer Older
  • Learn to ignore specific revisions
  • use hercules_ir::ir::{Device, Schedule};
    
    Aaron Councilman's avatar
    Aaron Councilman committed
    
    
    use crate::parser;
    
    
    Aaron Councilman's avatar
    Aaron Councilman committed
    #[derive(Debug, Copy, Clone)]
    pub enum Pass {
    
        ArraySLF,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        ArrayToProduct,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        AutoOutline,
        CCP,
        CRC,
    
        CleanMonoidReduces,
        ConstInline,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        DCE,
        FloatCollections,
    
    rarbore2's avatar
    rarbore2 committed
        ForkChunk,
        ForkCoalesce,
        ForkDimMerge,
    
    rarbore2's avatar
    rarbore2 committed
        ForkExtend,
    
    rarbore2's avatar
    rarbore2 committed
        ForkFissionBufferize,
    
    rarbore2's avatar
    rarbore2 committed
        ForkFusion,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        ForkGuardElim,
    
    rarbore2's avatar
    rarbore2 committed
        ForkInterchange,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        ForkReshape,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        ForkSplit,
    
    rarbore2's avatar
    rarbore2 committed
        ForkUnroll,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Forkify,
        GCM,
        GVN,
        InferSchedules,
        Inline,
        InterproceduralSROA,
    
        LoopBoundCanon,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Outline,
        PhiElim,
        Predication,
    
    rarbore2's avatar
    rarbore2 committed
        Print,
    
    rarbore2's avatar
    rarbore2 committed
        ReduceSLF,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Rename,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        ReuseProducts,
    
        RewriteMathExpressions,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        SLF,
        SROA,
    
    rarbore2's avatar
    rarbore2 committed
        Serialize,
        SimplifyCFG,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Unforkify,
    
    rarbore2's avatar
    rarbore2 committed
        UnforkifyOne,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Verify,
    
    rarbore2's avatar
    rarbore2 committed
        WritePredication,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Xdot,
    }
    
    impl Pass {
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        pub fn is_valid_num_args(&self, num: usize) -> bool {
    
    Aaron Councilman's avatar
    Aaron Councilman committed
            match self {
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::ArrayToProduct => num == 0 || num == 1,
    
    rarbore2's avatar
    rarbore2 committed
                Pass::ConstInline => num == 0 || num == 1,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::ForkChunk => num == 4,
    
    rarbore2's avatar
    rarbore2 committed
                Pass::ForkExtend => num == 1,
    
    rarbore2's avatar
    rarbore2 committed
                Pass::ForkFissionBufferize => num == 2 || num == 1,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::ForkInterchange => num == 2,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::ForkReshape => true,
    
    rarbore2's avatar
    rarbore2 committed
                Pass::InterproceduralSROA => num == 0 || num == 1,
    
    rarbore2's avatar
    rarbore2 committed
                Pass::Print => num == 1,
                Pass::Rename => num == 1,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::SROA => num == 0 || num == 1,
    
    rarbore2's avatar
    rarbore2 committed
                Pass::Xdot => num == 0 || num == 1,
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                _ => num == 0,
            }
        }
    
        pub fn valid_arg_nums(&self) -> &'static str {
            match self {
                Pass::ArrayToProduct => "0 or 1",
    
    rarbore2's avatar
    rarbore2 committed
                Pass::ConstInline => "0 or 1",
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::ForkChunk => "4",
    
    rarbore2's avatar
    rarbore2 committed
                Pass::ForkExtend => "1",
    
    rarbore2's avatar
    rarbore2 committed
                Pass::ForkFissionBufferize => "1 or 2",
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::ForkInterchange => "2",
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::ForkReshape => "any",
    
    rarbore2's avatar
    rarbore2 committed
                Pass::InterproceduralSROA => "0 or 1",
    
    rarbore2's avatar
    rarbore2 committed
                Pass::Print => "1",
                Pass::Rename => "1",
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                Pass::SROA => "0 or 1",
    
    rarbore2's avatar
    rarbore2 committed
                Pass::Xdot => "0 or 1",
    
    Aaron Councilman's avatar
    Aaron Councilman committed
                _ => "0",
    
    Aaron Councilman's avatar
    Aaron Councilman committed
            }
        }
    }
    
    #[derive(Debug, Clone)]
    pub enum Selector {
        Everything(),
        Selection(Vec<ScheduleExp>),
    }
    
    #[derive(Debug, Clone)]
    pub enum ScheduleExp {
        Variable {
            var: String,
        },
        Integer {
            val: usize,
        },
        Boolean {
            val: bool,
        },
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        String {
            val: String,
        },
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Field {
            collect: Box<ScheduleExp>,
            field: String,
        },
        RunPass {
            pass: Pass,
            args: Vec<ScheduleExp>,
            on: Selector,
        },
    
        DeleteUncalled {
            on: Selector,
        },
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Record {
            fields: Vec<(String, ScheduleExp)>,
        },
        Block {
            body: Vec<ScheduleStmt>,
            res: Box<ScheduleExp>,
        },
    
        SetOp {
            op: parser::SetOp,
            lhs: Box<ScheduleExp>,
            rhs: Box<ScheduleExp>,
        },
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        Tuple {
            exprs: Vec<ScheduleExp>,
        },
        TupleField {
            lhs: Box<ScheduleExp>,
            field: usize,
        },
    
    Aaron Councilman's avatar
    Aaron Councilman committed
        // This is used to "box" a selection by evaluating it at one point and then
        // allowing it to be used as a selector later on
        Selection {
            selection: Selector,
        },
    }
    
    #[derive(Debug, Copy, Clone)]
    pub enum FixpointLimit {
        NoLimit(),
        PrintIter(),
        StopAfter(usize),
        PanicAfter(usize),
    }
    
    #[derive(Debug, Clone)]
    pub enum ScheduleStmt {
        Fixpoint {
            body: Box<ScheduleStmt>,
            limit: FixpointLimit,
        },
        Block {
            body: Vec<ScheduleStmt>,
        },
        Let {
            var: String,
            exp: ScheduleExp,
        },
        Assign {
            var: String,
            exp: ScheduleExp,
        },
        AddSchedule {
            sched: Schedule,
            on: Selector,
        },
        AddDevice {
            device: Device,
            on: Selector,
        },
    }