aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristos Gentsos <christos.gentsos@cern.ch>2019-06-05 15:15:23 +0200
committerTristan Gingold <tgingold@free.fr>2019-06-06 18:47:05 +0200
commit2c72cffb32c5bfc081c4a182654f2c46bb288db6 (patch)
tree65ef32780d6253aea67dde8cc425269645a0d9e8
parent5bafb1b3aaf6edebb5308a9c361844b4d4438b6a (diff)
downloadghdl-2c72cffb32c5bfc081c4a182654f2c46bb288db6.tar.gz
ghdl-2c72cffb32c5bfc081c4a182654f2c46bb288db6.tar.bz2
ghdl-2c72cffb32c5bfc081c4a182654f2c46bb288db6.zip
synth: handle numeric_std subtraction (addition was already there)
-rw-r--r--src/synth/synth-expr.adb11
-rw-r--r--src/vhdl/vhdl-ieee-numeric.adb20
-rw-r--r--src/vhdl/vhdl-nodes.ads7
3 files changed, 38 insertions, 0 deletions
diff --git a/src/synth/synth-expr.adb b/src/synth/synth-expr.adb
index d13fc6cfc..d8645eeaf 100644
--- a/src/synth/synth-expr.adb
+++ b/src/synth/synth-expr.adb
@@ -479,6 +479,17 @@ package body Synth.Expr is
Synth_Uresize (Right, Get_Width (Left))),
Create_Res_Range (Left, L));
end;
+ when Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Nat =>
+ -- "-" (Unsigned, Natural)
+ declare
+ L : constant Net := Get_Net (Left);
+ begin
+ return Create_Value_Net
+ (Build_Dyadic (Build_Context, Id_Sub,
+ L,
+ Synth_Uresize (Right, Get_Width (Left))),
+ Create_Res_Range (Left, L));
+ end;
when Iir_Predefined_Ieee_Numeric_Std_Eq_Uns_Nat =>
-- "=" (Unsigned, Natural)
return Create_Value_Net
diff --git a/src/vhdl/vhdl-ieee-numeric.adb b/src/vhdl/vhdl-ieee-numeric.adb
index c42fb59b4..0c76ff533 100644
--- a/src/vhdl/vhdl-ieee-numeric.adb
+++ b/src/vhdl/vhdl-ieee-numeric.adb
@@ -52,6 +52,24 @@ package body Vhdl.Ieee.Numeric is
(others =>
(others => Iir_Predefined_None)));
+ Sub_Patterns : constant Binary_Pattern_Type :=
+ (Pkg_Std =>
+ (Type_Unsigned =>
+ (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Uns,
+ Arg_Vect_Scal => Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Nat,
+ Arg_Scal_Vect => Iir_Predefined_Ieee_Numeric_Std_Sub_Nat_Uns,
+ Arg_Vect_Log => Iir_Predefined_None,
+ Arg_Log_Vect => Iir_Predefined_None),
+ Type_Signed =>
+ (Arg_Vect_Vect => Iir_Predefined_Ieee_Numeric_Std_Sub_Sgn_Sgn,
+ Arg_Vect_Scal => Iir_Predefined_Ieee_Numeric_Std_Sub_Sgn_Int,
+ Arg_Scal_Vect => Iir_Predefined_Ieee_Numeric_Std_Sub_Int_Sgn,
+ Arg_Vect_Log => Iir_Predefined_None,
+ Arg_Log_Vect => Iir_Predefined_None)),
+ Pkg_Bit =>
+ (others =>
+ (others => Iir_Predefined_None)));
+
Eq_Patterns : constant Binary_Pattern_Type :=
(Pkg_Std =>
(Type_Unsigned =>
@@ -221,6 +239,8 @@ package body Vhdl.Ieee.Numeric is
case Get_Identifier (Decl) is
when Name_Op_Plus =>
Handle_Binary (Add_Patterns);
+ when Name_Op_Minus =>
+ Handle_Binary (Sub_Patterns);
when Name_Op_Equality =>
Handle_Binary (Eq_Patterns);
when Name_To_Bstring
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index 228b58d68..3f4213ca7 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -4815,6 +4815,13 @@ package Vhdl.Nodes is
Iir_Predefined_Ieee_Numeric_Std_Add_Sgn_Int,
Iir_Predefined_Ieee_Numeric_Std_Add_Int_Sgn,
+ Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Uns,
+ Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Nat,
+ Iir_Predefined_Ieee_Numeric_Std_Sub_Nat_Uns,
+ Iir_Predefined_Ieee_Numeric_Std_Sub_Sgn_Sgn,
+ Iir_Predefined_Ieee_Numeric_Std_Sub_Sgn_Int,
+ Iir_Predefined_Ieee_Numeric_Std_Sub_Int_Sgn,
+
Iir_Predefined_Ieee_Numeric_Std_Eq_Uns_Uns,
Iir_Predefined_Ieee_Numeric_Std_Eq_Uns_Nat,
Iir_Predefined_Ieee_Numeric_Std_Eq_Nat_Uns,