diff options
Diffstat (limited to 'src/kompsos-arithmetic.ads')
| -rw-r--r-- | src/kompsos-arithmetic.ads | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/kompsos-arithmetic.ads b/src/kompsos-arithmetic.ads new file mode 100644 index 0000000..85071cc --- /dev/null +++ b/src/kompsos-arithmetic.ads @@ -0,0 +1,185 @@ + + +-- Programmed by Jedidiah Barber +-- Licensed under the Sunset License v1.0 + +-- See license.txt for further details + + +generic + Zero_Element, One_Element : in Element_Type; +package Kompsos.Arithmetic is + + + --------------- + -- Numbers -- + --------------- + + -- Valid number Terms are little endian binary lists + -- representing non-negative integers. + + -- The last digit in a non-empty list must always be + -- the One_Element. + + -- 0 -> () + -- 1 -> (1) + -- 2 -> (0 1) + -- 3 -> (1 1) + -- 4 -> (0 0 1) + -- 5 -> (1 0 1) + -- 6 -> (0 1 1) + -- 7 -> (1 1 1) + -- 8 -> (0 0 0 1) + -- ...and so forth. + + Zero_Term, One_Term : constant Term; + + function Is_Number + (Item : in Term) + return Boolean; + + function Build + (Value : in Natural) + return Term; + + function Value + (Item : in Term) + return Natural + with Pre => Is_Number (Item); + + + + + ------------------ + -- Operations -- + ------------------ + + -- full-addero -- + -- Note the inputs here are all just the raw Zero_Element and One_Element, + -- not the proper numbers constructed by Build. + + -- Inputs = Cin_Term & A_Term & B_Term & Sum_Term & Cout_Term + function Full_Adder + (This : in Goal; + Inputs : in Term_Array) + return Goal + with Pre => Inputs'Length = 5; + + -- Inputs = Cin_Term & A_Term & B_Term & Sum_Term & Cout_Term + procedure Full_Adder + (This : in out Goal; + Inputs : in Term_Array) + with Pre => Inputs'Length = 5; + + + -- poso -- + + function GT_Zero + (This : in Goal; + Num_Term : in Term'Class) + return Goal; + + procedure GT_Zero + (This : in out Goal; + Num_Term : in Term'Class); + + + -- >1o -- + + function GT_One + (This : in Goal; + Num_Term : in Term'Class) + return Goal; + + procedure GT_One + (This : in out Goal; + Num_Term : in Term'Class); + + + -- +o -- + -- Inputs = N_Term & M_Term & Result_Term + function Add + (This : in Goal; + Inputs : in Term_Array) + return Goal + with Pre => Inputs'Length = 3; + + -- Inputs = N_Term & M_Term & Result_Term + procedure Add + (This : in out Goal; + Inputs : in Term_Array) + with Pre => Inputs'Length = 3; + + + -- -o -- + -- Inputs = N_Term & M_Term & Result_Term + function Subtract + (This : in Goal; + Inputs : in Term_Array) + return Goal + with Pre => Inputs'Length = 3; + + -- Inputs = N_Term & M_Term & Result_Term + procedure Subtract + (This : in out Goal; + Inputs : in Term_Array) + with Pre => Inputs'Length = 3; + + +private + + + Zero_Term : constant Term := Build (0); + One_Term : constant Term := Build (1); + + + + -- addero -- + -- The carry-in input is a raw Zero_Element or One_Element. + + -- Inputs = Cin_Term & N_Term & M_Term & Result_Term + function Adder + (This : in Goal; + Inputs : in Term_Array) + return Goal + with Pre => Inputs'Length = 4; + + -- Inputs = Cin_Term & N_Term & M_Term & Result_Term + procedure Adder + (This : in out Goal; + Inputs : in Term_Array) + with Pre => Inputs'Length = 4; + + -- This is needed for dumb reasons. + Adder_Access : constant access function + (This : in Goal; + Inputs : in Term_Array) + return Goal := Adder'Access; + + + -- gen-addero -- + -- The carry-in input is a raw Zero_Element or One_Element. + + -- Inputs = Cin_Term & N_Term & M_Term & Result_Term + function General_Adder + (This : in Goal; + Inputs : in Term_Array) + return Goal + with Pre => Inputs'Length = 4; + + -- Inputs = Cin_Term & N_Term & M_Term & Result_Term + procedure General_Adder + (This : in out Goal; + Inputs : in Term_Array) + with Pre => Inputs'Length = 4; + + -- This is needed for dumb reasons. + General_Adder_Access : constant access function + (This : in Goal; + Inputs : in Term_Array) + return Goal := General_Adder'Access; + + +end Kompsos.Arithmetic; + + |
