aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/netlists-builders.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth/netlists-builders.adb')
-rw-r--r--src/synth/netlists-builders.adb35
1 files changed, 25 insertions, 10 deletions
diff --git a/src/synth/netlists-builders.adb b/src/synth/netlists-builders.adb
index ac1115af7..15d570a70 100644
--- a/src/synth/netlists-builders.adb
+++ b/src/synth/netlists-builders.adb
@@ -385,19 +385,22 @@ package body Netlists.Builders is
Set_Ports_Desc (Res, Inputs (0 .. 1), Outputs (0 .. 0));
end Create_Memory_Modules;
- procedure Create_Edge_Module (Ctxt : Context_Acc;
- Res : out Module;
- Name : Name_Id)
-
+ procedure Create_Edge_Module (Ctxt : Context_Acc)
is
Outputs : Port_Desc_Array (0 .. 0);
Inputs : Port_Desc_Array (0 .. 0);
begin
- Res := New_User_Module
- (Ctxt.Design, New_Sname_Artificial (Name, No_Sname), Id_Edge, 1, 1, 0);
+ Ctxt.M_Posedge := New_User_Module
+ (Ctxt.Design, New_Sname_Artificial (Name_Posedge, No_Sname),
+ Id_Posedge, 1, 1, 0);
Inputs := (0 => Create_Input ("i", 1));
Outputs := (0 => Create_Output ("o", 1));
- Set_Ports_Desc (Res, Inputs, Outputs);
+ Set_Ports_Desc (Ctxt.M_Posedge, Inputs, Outputs);
+
+ Ctxt.M_Negedge := New_User_Module
+ (Ctxt.Design, New_Sname_Artificial (Name_Negedge, No_Sname),
+ Id_Negedge, 1, 1, 0);
+ Set_Ports_Desc (Ctxt.M_Negedge, Inputs, Outputs);
end Create_Edge_Module;
procedure Create_Mux_Modules (Ctxt : Context_Acc)
@@ -707,7 +710,7 @@ package body Netlists.Builders is
Create_Monadic_Module (Design, Res.M_Reduce (Id_Red_And),
Get_Identifier ("red_and"), Id_Red_And);
- Create_Edge_Module (Res, Res.M_Edge, Name_Edge);
+ Create_Edge_Module (Res);
Create_Mux_Modules (Res);
Create_Objects_Module (Res);
@@ -932,19 +935,31 @@ package body Netlists.Builders is
return Inst;
end Build_Const_Log;
- function Build_Edge (Ctxt : Context_Acc; Src : Net) return Net
+ function Build_Edge (Ctxt : Context_Acc; M : Module; Src : Net) return Net
is
pragma Assert (Get_Width (Src) = 1);
Inst : Instance;
O : Net;
begin
- Inst := New_Internal_Instance (Ctxt, Ctxt.M_Edge);
+ Inst := New_Internal_Instance (Ctxt, M);
O := Get_Output (Inst, 0);
pragma Assert (Get_Width (O) = 1);
Connect (Get_Input (Inst, 0), Src);
return O;
end Build_Edge;
+ pragma Inline (Build_Edge);
+
+ function Build_Posedge (Ctxt : Context_Acc; Src : Net) return Net is
+ begin
+ return Build_Edge (Ctxt, Ctxt.M_Posedge, Src);
+ end Build_Posedge;
+
+ function Build_Negedge (Ctxt : Context_Acc; Src : Net) return Net is
+ begin
+ return Build_Edge (Ctxt, Ctxt.M_Negedge, Src);
+ end Build_Negedge;
+
function Build_Mux2 (Ctxt : Context_Acc;
Sel : Net;
I0, I1 : Net) return Net