From 3f46ee724f0b8a7ed369c131a34b1fa8dfada3d7 Mon Sep 17 00:00:00 2001
From: Michiel Cottaar <michiel.cottaar@ndcn.ox.ac.uk>
Date: Mon, 12 Feb 2024 17:45:45 +0000
Subject: [PATCH] Add Wait block as a sub-type of BaseBuildingBlock

---
 .../all_building_blocks.jl                    |  2 ++
 src/all_building_blocks/wait_blocks.jl        | 22 +++++++++++++++++++
 2 files changed, 24 insertions(+)
 create mode 100644 src/all_building_blocks/wait_blocks.jl

diff --git a/src/all_building_blocks/all_building_blocks.jl b/src/all_building_blocks/all_building_blocks.jl
index 8a4d260..a337c92 100644
--- a/src/all_building_blocks/all_building_blocks.jl
+++ b/src/all_building_blocks/all_building_blocks.jl
@@ -3,10 +3,12 @@ include("base_building_blocks.jl")
 include("building_blocks.jl")
 include("trapezoids.jl")
 include("spoilt_slice_selects.jl")
+include("wait_blocks.jl")
 
 import .BaseBuildingBlocks: waveform, waveform_sequence, events, BaseBuildingBlock
 import .BuildingBlocks: BuildingBlock
 import .Trapezoids: Trapezoid, SliceSelect, LineReadout
 import .SpoiltSliceSelects: SpoiltSliceSelect
+import ..WaitBlocks: Wait
 
 end
\ No newline at end of file
diff --git a/src/all_building_blocks/wait_blocks.jl b/src/all_building_blocks/wait_blocks.jl
new file mode 100644
index 0000000..3558cf8
--- /dev/null
+++ b/src/all_building_blocks/wait_blocks.jl
@@ -0,0 +1,22 @@
+module WaitBlocks
+import JuMP: @constraint
+import ...BuildSequences: get_global_model
+import ...Variables: get_free_variable, VariableType, duration
+import ...Components: NoGradient
+import ..BaseBuildingBlocks: BaseBuildingBlock
+
+struct Wait <: BuildingBlock
+    duration :: VariableType
+    function Wait(var)
+        res = new(get_free_variable(var))
+        if !(res.duration isa Number)
+            @constraint get_global_model() res.duration >= 0
+        end
+    end
+end
+
+duration(wb::Wait) = wb.duration
+Base.keys(::Wait) = (:empty)
+Base.getindex(wb::Wait) = NoGradient{1}(wb.duration)
+
+end
\ No newline at end of file
-- 
GitLab