include "primitives.alh"

Class Float {}
Class String {}

Class Block{
    signal : Float {
        target_lower_cardinality = 1
        target_upper_cardinality = 1
    }
}
Class ICBlock{
    last_in : Float {
        target_lower_cardinality = 0
        target_upper_cardinality = 1
    }
}

Class ConstantBlock{
    value : Float {
        target_lower_cardinality = 1
        target_upper_cardinality = 1
    }
}

Class ProbeBlock{
    name : String {
        target_lower_cardinality = 1
        target_upper_cardinality = 1
    }
}

Class AdditionBlock{}
Class NegatorBlock{}
Class MultiplyBlock{}
Class InverseBlock{}
Class DelayBlock{}
Class IntegratorBlock{
    last_out : Float {
        target_lower_cardinality = 0
        target_upper_cardinality = 1
    }
}

Class DerivatorBlock{}
Class Time{
    lower_cardinality = 1
    upper_cardinality = 1

    start_time : Float {
        target_lower_cardinality = 1
        target_upper_cardinality = 1
    }

    current_time : Float {
        target_lower_cardinality = 1
        target_upper_cardinality = 1
    }
}

Association Link(Block, Block){}
Association InitialCondition(Block, ICBlock){
    source_lower_cardinality = 0
    source_upper_cardinality = 1
}

Inheritance (ConstantBlock, Block){}
Inheritance (AdditionBlock, Block){}
Inheritance (NegatorBlock, Block){}
Inheritance (MultiplyBlock, Block){}
Inheritance (InverseBlock, Block){}
Inheritance (ICBlock, Block){}
Inheritance (DelayBlock, ICBlock){}
Inheritance (DerivatorBlock, ICBlock){}
Inheritance (IntegratorBlock, ICBlock){}
Inheritance (ProbeBlock, Block){}
