import models/SimpleClassDiagrams as SCD
include "primitives.alh"

SCD CausalBlockDiagrams_Design{
    Class Float {
        $
            if (bool_not(is_physical_float(self))):
                return "Float has no float value"!
            else:
                return "OK"!
        $
    }

    Class String {
        $
            if (bool_not(is_physical_string(self))):
                return "String has no string value"!
            else:
                return "OK"!
        $
    }

    Class Block{}
    Class ICBlock{}

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

    Class AdditionBlock{}
    Class NegatorBlock{}
    Class MultiplyBlock{}
    Class InverseBlock{}
    Class DelayBlock{}
    Class IntegratorBlock{}
    Class DerivatorBlock{}
    Class ProbeBlock{
        name : String {
            target_lower_cardinality = 1
            target_upper_cardinality = 1
        }
    }

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

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

export CausalBlockDiagrams_Design to models/CausalBlockDiagrams_Design
