diff --git a/morphisms/angle.morphism-base b/morphisms/angle.morphism-base new file mode 100644 index 0000000..71aba96 --- /dev/null +++ b/morphisms/angle.morphism-base @@ -0,0 +1,72 @@ +``` +#define PHI 6.28318530718 +``` + +morph_angle_as_degrees_to_turns_float () + Angle ~ Degrees ~ ℝ ~ native.Float +--> Angle ~ Turns ~ ℝ ~ native.Float +``` + *dst = *src / 360.0; + return 0; +``` + +morph_angle_as_degrees_to_turns_double () + Angle ~ Degrees ~ ℝ ~ native.Double +--> Angle ~ Turns ~ ℝ ~ native.Double +``` + *dst = *src / 360.0; + return 0; +``` + + +morph_angle_as_turns_to_degrees_float () + Angle ~ Turns ~ ℝ ~ native.Float +--> Angle ~ Degrees ~ ℝ ~ native.Float +``` + *dst = *src * 360.0; + return 0; +``` + +morph_angle_as_turns_to_degrees_double () + Angle ~ Turns ~ ℝ ~ native.Double +--> Angle ~ Degrees ~ ℝ ~ native.Double +``` + *dst = *src * 360.0; + return 0; +``` + + + + +morph_angle_as_radians_to_turns_float () + Angle ~ Radians ~ ℝ ~ native.Float +--> Angle ~ Turns ~ ℝ ~ native.Float +``` + *dst = *src / PHI; + return 0; +``` + +morph_angle_as_radians_to_turns_double () + Angle ~ Radians ~ ℝ ~ native.Double +--> Angle ~ Turns ~ ℝ ~ native.Double +``` + *dst = *src / PHI; + return 0; +``` + + +morph_angle_as_turns_to_radians_float () + Angle ~ Turns ~ ℝ ~ native.Float +--> Angle ~ Radians ~ ℝ ~ native.Float +``` + *dst = *src * PHI; + return 0; +``` + +morph_angle_as_degrees_to_radians_double () + Angle ~ Turns ~ ℝ ~ native.Double +--> Angle ~ Radians ~ ℝ ~ native.Double +``` + *dst = *src * PHI; + return 0; +``` diff --git a/morphisms/posint.morphism-base b/morphisms/posint.morphism-base index d8838e0..64dea71 100644 --- a/morphisms/posint.morphism-base +++ b/morphisms/posint.morphism-base @@ -14,9 +14,9 @@ morph_nat_as_u64_to_pos () return 0; ``` -morph_nat_as_u64_to_pos () +morph_nat_as_pos_to_u64 (Endianness:Type) ℕ - ~ <PosInt 0 LittleEndian> + ~ <PosInt 0 Endianness> ~ <Seq~<LengthPrefix x86.UInt64> <Digit 0>~x86.UInt64> --> ℕ ~ x86.UInt64 @@ -42,14 +42,16 @@ morph_posint_radix_le (SrcRadix:ℤ, DstRadix:ℤ) length_prefix_uint64_array_clear( dst ); - if( DstRadix == 0 ) { + #if DstRadix==0 length_prefix_uint64_array_push( dst, value ); - } else if( DstRadix > 0 ) { - while( value > 0 ) { + #else + if( value == 0 ) { + length_prefix_uint64_array_push( dst, 0 ); + } else while( value > 0 ) { length_prefix_uint64_array_push( dst, value % DstRadix ); value /= DstRadix; } - } + #endif return 0; ``` @@ -69,13 +71,16 @@ morph_posint_radix_be (SrcRadix:ℤ, DstRadix:ℤ) value += src->items[i]; } - if( DstRadix == 0 ) { + #if DstRadix==0 dst->len = 1; dst->items[0] = value; - } else { + #else uint64_t v = value; dst->len = 0; - while( v ) { + + if( v == 0 ) { + dst->len = 1; + } else while( v ) { dst->len++; v /= DstRadix; } @@ -85,7 +90,7 @@ morph_posint_radix_be (SrcRadix:ℤ, DstRadix:ℤ) dst->items[--i] = value % DstRadix; value /= DstRadix; } - } + #endif return 0; ``` diff --git a/morphisms/real.morphism-base b/morphisms/real.morphism-base new file mode 100644 index 0000000..204bfbd --- /dev/null +++ b/morphisms/real.morphism-base @@ -0,0 +1,105 @@ +``` +#include <stdio.h> +``` + +morph_real_as_decimalstr_to_float () + ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +--> ℝ ~ native.Float +``` + sscanf(src, "%f", dst); + return 0; +``` + +morph_real_as_decimalstr_to_double () + ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +--> ℝ ~ native.Double +``` + sscanf(src, "%lf", dst); + return 0; +``` + +morph_real_as_float_to_decimalstr () + ℝ ~ native.Float +--> ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +``` + sprintf(dst, "%f", *src); + return 0; +``` + +morph_real_as_double_to_decimalstr () + ℝ ~ native.Double +--> ℝ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10>~Char~Ascii~x86.UInt8> +``` + sprintf(dst, "%f", *src); + return 0; +``` + + +morph_real_as_float_to_double () + ℝ ~ native.Float +--> ℝ ~ native.Double +``` + *dst = *src; + return 0; +``` + +morph_real_as_double_to_float () + ℝ ~ native.Double +--> ℝ ~ native.Float +``` + fprintf(stderr, "Warning: morphin Double -> Float. Precision loss!"); + *dst = *src; + return 0; +``` + +morph_real_as_u64_to_float () + ℝ ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Float +``` + fprintf(stderr, "Warning: morphin UInt64 -> Float. Precision loss!"); + *dst = *src; + return 0; +``` + +morph_real_as_u64_to_double () + ℝ ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Double +``` + fprintf(stderr, "Warning: morphin UInt64 -> Double. Precision loss!"); + *dst = *src; + return 0; +``` + +morph_real_as_quantized_linear_to_float (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Float +``` + *dst = (float)Begin + ( *src * ((float)End - (float)Begin) ) / (float)Steps; + return 0; +``` + +morph_real_as_float_to_quantized_linear (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ native.Float +--> ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +``` + *dst = ((*src - (float)Begin) * (float)Steps) / ((float)End - (float)Begin); + return 0; +``` + + + +morph_real_as_quantized_linear_to_double (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +--> ℝ ~ native.Double +``` + *dst = (double)Begin + ( *src * ((double)End - (double)Begin) ) / (double)Steps; + return 0; +``` + +morph_real_as_double_to_quantized_linear (Begin: ℝ, End: ℝ, Steps: ℤ) + ℝ ~ native.Double +--> ℝ ~ <QuantizedLinear Begin End Steps> ~ ℕ ~ x86.UInt64 +``` + *dst = ((*src - (double)Begin) * (double)Steps) / ((double)End - (double)Begin); + return 0; +``` diff --git a/morphisms/temperature.morphism-base b/morphisms/temperature.morphism-base new file mode 100644 index 0000000..7831292 --- /dev/null +++ b/morphisms/temperature.morphism-base @@ -0,0 +1,34 @@ +``` +``` + +morph_celsius_to_kelvin () + Temperature ~ Celsius ~ ℝ ~ native.Float +--> Temperature ~ Kelvin ~ ℝ ~ native.Float +``` + *dst = *src + 273.15; + return 0; +``` + +morph_kelvin_to_celsius () + Temperature ~ Kelvin ~ ℝ ~ native.Float +--> Temperature ~ Celsius ~ ℝ ~ native.Float +``` + *dst = *src - 273.15; + return 0; +``` + +morph_celsius_to_fahrenheit () + Temperature ~ Celsius ~ ℝ ~ native.Float +--> Temperature ~ Fahrenheit ~ ℝ ~ native.Float +``` + *dst = (*src * 9.0 / 5.0) + 32.0; + return 0; +``` + +morph_fahrenheit_to_celsius () + Temperature ~ Fahrenheit ~ ℝ ~ native.Float +--> Temperature ~ Celsius ~ ℝ ~ native.Float +``` + *dst = (*src - 32.0) * 5.0 / 9.0; + return 0; +``` diff --git a/src/c_gen.rs b/src/c_gen.rs index 8b7f938..e13a4d3 100644 --- a/src/c_gen.rs +++ b/src/c_gen.rs @@ -30,6 +30,10 @@ pub fn get_c_repr_type(dict: &mut impl TypeDict, t: laddertypes::TypeTerm, skip_ Some("uint32_t".into()) } else if t == &dict.parse("x86.UInt64").expect("parse") { Some("uint64_t".into()) + } else if t == &dict.parse("native.Float").expect("parse") { + Some("float".into()) + } else if t == &dict.parse("native.Double").expect("parse") { + Some("double".into()) } else { match t { laddertypes::TypeTerm::App(args) => { @@ -158,15 +162,18 @@ pub fn generate_main(type_dict: &mut impl TypeDict, path: Vec<MorphismInstance<L println!(r#" int main() {{ -uint8_t bufA[1024]; -uint8_t bufB[1024]; +uint8_t bufA[128]; +uint8_t bufB[128]; + +memset(bufA, 0, sizeof(bufA)); +memset(bufB, 0, sizeof(bufB)); char in_str[] = "read :: {} \n"; char out_str[]= "write:: {} \n"; write(2, in_str, strlen(in_str)); write(2, out_str, strlen(out_str)); -int l = read(0, bufA, 1024); +int l = read(0, bufA, sizeof(bufA)); fprintf(stderr, "read %d bytes\n", l); "#, @@ -217,7 +224,7 @@ printf("%s\n", {});"#, out_buf); println!(r#" write(1, {}, {});"#, out_buf, - 1024 + "sizeof(bufA)" ); }