diff --git a/src/dram/lambdas/action.h b/src/dram/lambdas/action.h
index bf3807b..7d08383 100644
--- a/src/dram/lambdas/action.h
+++ b/src/dram/lambdas/action.h
@@ -26,0 +27,149 @@ namespace Bank {
+
+  template <class T>
+  void ACTAB(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+    // For HBM3
+    if constexpr (T::m_levels["bank"] - T::m_levels["channel"] == 4) {
+      typename T::Node* channel = node->m_parent_node->m_parent_node->m_parent_node->m_parent_node;
+      for (auto pc : channel->m_child_nodes) {
+        for (auto rank : pc->m_child_nodes) {
+          for (auto bg : rank->m_child_nodes) {
+            for (auto bank : bg->m_child_nodes) {
+              bank->m_state = T::m_states["Opened"];
+              bank->m_row_state[target_id] = T::m_states["Opened"];
+            }
+          }
+        }
+      }
+    } else {
+      static_assert(
+        false_v<T>,
+        "[Action::Bank] Unsupported organization. Please write your own ACTAB function."
+      );
+    }
+  };
+
+  template <class T>
+  void ACTSB(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+    // For HBM3
+    if constexpr (T::m_levels["bank"] - T::m_levels["channel"] == 4) {
+      typename T::Node* ch = node->m_parent_node->m_parent_node->m_parent_node->m_parent_node;
+      for (auto pch : ch->m_child_nodes) {
+        for (auto rank : pch->m_child_nodes) {
+          for (auto bg : rank->m_child_nodes) {
+            for (auto bank : bg->m_child_nodes) {
+              if (bank->m_node_id == node->m_node_id) {
+                bank->m_state = T::m_states["Opened"];
+                bank->m_row_state[target_id] = T::m_states["Opened"];
+              }
+            }
+          }
+        }
+      }
+    } else {
+      static_assert(
+        false_v<T>,
+        "[Action::Bank] Unsupported organization. Please write your own ACTSB function."
+      );
+    }
+  };
+
+  template <class T>
+  void ACTPB(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+    // For HBM3
+    if constexpr (T::m_levels["bank"] - T::m_levels["channel"] == 4) {
+      typename T::Node* ch = node->m_parent_node->m_parent_node->m_parent_node->m_parent_node;
+      for (auto pch : ch->m_child_nodes) {
+        for (auto rank : pch->m_child_nodes) {
+          if (rank->m_node_id == node->m_parent_node->m_parent_node->m_node_id) {
+            for (auto bg : rank->m_child_nodes) {
+              if (bg->m_node_id == node->m_parent_node->m_node_id) {
+                for (auto bank : bg->m_child_nodes) {
+                  if (bank->m_node_id == node->m_node_id) {
+                    bank->m_state = T::m_states["Opened"];
+                    bank->m_row_state[target_id] = T::m_states["Opened"];
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    } else {
+      static_assert(
+        false_v<T>,
+        "[Action::Bank] Unsupported organization. Please write your own ACTPB function."
+      );
+    }
+  };
+
+  template <class T>
+  void PRESB(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+    // For HBM3
+    if constexpr (T::m_levels["bank"] - T::m_levels["channel"] == 4) {
+      typename T::Node* ch = node->m_parent_node->m_parent_node->m_parent_node->m_parent_node;
+      for (auto pch : ch->m_child_nodes) {
+        for (auto rank : pch->m_child_nodes) {
+          if (rank->m_node_id == node->m_parent_node->m_parent_node->m_node_id) {
+            for (auto bg : rank->m_child_nodes) {
+              if (bg->m_node_id == node->m_parent_node->m_node_id) {
+                for (auto bank : bg->m_child_nodes) {
+                  if (bank->m_node_id == node->m_node_id) {
+                    bank->m_state = T::m_states["Closed"];
+                    bank->m_row_state.clear();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    } else {
+      static_assert(
+        false_v<T>,
+        "[Action::Bank] Unsupported organization. Please write your own PREPB function."
+      );
+    }
+  };
+
+  template <class T>
+  void PREsb(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+    typename T::Node* rank = node->m_parent_node->m_parent_node;
+    for (auto bg : rank->m_child_nodes) {
+      for (auto bank : bg->m_child_nodes) {
+        if (bank->m_node_id == node->m_node_id) {
+          bank->m_state = T::m_states["Closed"];
+          bank->m_row_state.clear();
+        }
+      }
+    }
+  };  
+
+  template <class T>
+  void PREPB(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+    // For HBM3
+    if constexpr (T::m_levels["bank"] - T::m_levels["channel"] == 4) {
+      typename T::Node* ch = node->m_parent_node->m_parent_node->m_parent_node->m_parent_node;
+      for (auto pch : ch->m_child_nodes) {
+        for (auto rank : pch->m_child_nodes) {
+          if (rank->m_node_id == node->m_parent_node->m_parent_node->m_node_id) {
+            for (auto bg : rank->m_child_nodes) {
+              if (bg->m_node_id == node->m_parent_node->m_node_id) {
+                for (auto bank : bg->m_child_nodes) {
+                  if (bank->m_node_id == node->m_node_id) {
+                    bank->m_state = T::m_states["Closed"];
+                    bank->m_row_state.clear();
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    } else {
+      static_assert(
+        false_v<T>,
+        "[Action::Bank] Unsupported organization. Please write your own ACTPB function."
+      );
+    }
+  };
+
@@ -43 +191,0 @@ namespace BankGroup {
-
@@ -52 +200 @@ namespace BankGroup {
-        if (bank->m_node_id == target_id) {      // Ch  Ra  Bg     Ba      Ro  Co
+        if (bank->m_node_id == target_id) {
@@ -57,0 +206,44 @@ namespace BankGroup {
+
+  template <class T>
+  void PIMSameBankActions(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+    AddrVec_t same_bank_addr(T::m_levels.size(), -1);
+    same_bank_addr[T::m_levels["bank"]] = target_id;
+
+    typename T::Node* ch = node->m_parent_node->m_parent_node->m_parent_node;
+    for (auto pch : ch->m_child_nodes) {
+      for (auto rank : pch->m_child_nodes) {
+        for (auto bg : rank->m_child_nodes) {
+          for (auto bank : bg->m_child_nodes) {
+            if (bank->m_node_id == target_id) {
+              bank->update_timing(cmd, same_bank_addr, clk);
+            }
+          }
+        }
+      }
+    }
+  }
+
+
+  template <class T>
+  void PIMPerBankActions(typename T::Node* node, int cmd, int target_id, Clk_t clk) { // pCH Broadcast
+    AddrVec_t same_bank_addr(T::m_levels.size(), -1);
+    same_bank_addr[T::m_levels["bank"]] = target_id;
+
+    typename T::Node* ch = node->m_parent_node->m_parent_node->m_parent_node;
+    for (auto pch : ch->m_child_nodes) {
+      for (auto rank : pch->m_child_nodes) {
+        if (rank->m_node_id == node->m_parent_node->m_parent_node->m_node_id) {
+          for (auto bg : rank->m_child_nodes) {
+            if (bg->m_node_id == node->m_parent_node->m_node_id) {
+              for (auto bank : bg->m_child_nodes) {
+                if (bank->m_node_id == target_id) {
+                  bank->update_timing(cmd, same_bank_addr, clk);
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
@@ -63 +255 @@ namespace Rank {
-  void PREab(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+  void PREA(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
@@ -79 +271 @@ namespace Rank {
-        "[Action::Rank] Unsupported organization. Please write your own PREab function."
+        "[Action::Rank] Unsupported organization. Please write your own PREA function."
@@ -101 +293 @@ namespace Channel {
-  void PREab(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
+  void PREA(typename T::Node* node, int cmd, int target_id, Clk_t clk) {
@@ -117,0 +310,11 @@ namespace Channel {
+    } else if constexpr (T::m_levels["bank"] - T::m_levels["channel"] == 4) {
+      for (auto pc : node->m_child_nodes) {
+        for (auto rank : pc->m_child_nodes) {
+          for (auto bg : rank->m_child_nodes) {
+            for (auto bank : bg->m_child_nodes) {
+              bank->m_state = T::m_states["Closed"];
+              bank->m_row_state.clear();
+            }
+          }
+        }
+      }
@@ -121 +324 @@ namespace Channel {
-        "[Action::Rank] Unsupported organization. Please write your own PREab function."
+        "[Action::Rank] Unsupported organization. Please write your own PREA function."
@@ -125,0 +329 @@ namespace Channel {
+
