diff --git a/src/chip_data/hei_chip_data.cpp b/src/chip_data/hei_chip_data.cpp
index c5506aa..b37eb58 100644
--- a/src/chip_data/hei_chip_data.cpp
+++ b/src/chip_data/hei_chip_data.cpp
@@ -18,6 +18,7 @@
 
 constexpr Version_t VERSION_1 = 0x01;
 constexpr Version_t VERSION_2 = 0x02;
+constexpr Version_t VERSION_3 = 0x03;
 
 //------------------------------------------------------------------------------
 
@@ -251,6 +252,25 @@
     Instance_t numInsts;
     io_stream >> nodeId >> regType >> numInsts;
 
+    // Version 3 and above: Read any write operations that exist.
+    std::map<OpRuleName_t, std::pair<OpRuleType_t, RegisterId_t>> opRules;
+    if (VERSION_3 <= i_version)
+    {
+        uint8_t numOpRules;
+        io_stream >> numOpRules;
+        for (unsigned int i = 0; i < numOpRules; i++)
+        {
+            OpRuleName_t opName;
+            OpRuleType_t opType;
+            RegisterId_t regId;
+            io_stream >> opName >> opType >> regId;
+
+            std::pair<OpRuleType_t, RegisterId_t> tmpPair = {opType, regId};
+            auto ret = opRules.emplace(opName, tmpPair);
+            HEI_ASSERT(ret.second || ret.first->second == tmpPair);
+        }
+    }
+
     for (unsigned int i = 0; i < numInsts; i++)
     {
         // Read the node instance metadata.
@@ -325,6 +345,16 @@
             HEI_ASSERT(ret.second); // Should not have duplicate entries
         }
 
+        // Version 3 and above: Add any write operations to the isoNode.
+        if (VERSION_3 <= i_version)
+        {
+            for (const auto& rule : opRules)
+            {
+                isoNode->addOpRule(rule.first, rule.second.first,
+                                   rule.second.second);
+            }
+        }
+
         // Add this isolation node with the temporary child node map to the
         // returned map of nodes.
         auto ret = io_tmpNodeMap.emplace(IsolationNode::Key{nodeId, nodeInst},
@@ -397,7 +427,7 @@
     HEI_ASSERT(io_isoChips.end() == io_isoChips.find(chipType));
 
     // Check supported versions.
-    HEI_ASSERT(VERSION_1 <= version && version <= VERSION_2);
+    HEI_ASSERT(VERSION_1 <= version && version <= VERSION_3);
 
     // Allocate memory for the new isolation chip.
     auto isoChip = std::make_shared<IsolationChip>(chipType);
diff --git a/src/hei_types.hpp b/src/hei_types.hpp
index 80f5ef8..dc88351 100644
--- a/src/hei_types.hpp
+++ b/src/hei_types.hpp
@@ -134,6 +134,32 @@
 using RegisterAddress_t = uint64_t;
 
 /**
+ * This is used to define the name of a write operation rule for a FIR,
+ * defined in the Chip Data Files.
+ *
+ * Values:
+ *   This is a hashed value of one of the following string names:
+ *   "FIR_SET", "FIR_CLEAR", "MASK_SET", "MASK_CLEAR".
+ *
+ * Range:
+ *   This is defined as a 1-byte field in the Chip Data Files.
+ */
+using OpRuleName_t = uint8_t;
+
+/**
+ * This is used to define the type of a write operation rule for a FIR,
+ * defined in the Chip Data Files.
+ *
+ * Values:
+ *   This is a hashed value of one of the following string names:
+ *   "atomic_or", "atomic_and", "read_set_write", "read_clear_write".
+ *
+ * Range:
+ *   This is defined as a 1-byte field in the Chip Data Files.
+ */
+using OpRuleType_t = uint8_t;
+
+/**
  * The hardware register attribute flags.
  *
  * Values:
diff --git a/src/isolator/hei_isolation_node.cpp b/src/isolator/hei_isolation_node.cpp
index 78c5b65..d156015 100644
--- a/src/isolator/hei_isolation_node.cpp
+++ b/src/isolator/hei_isolation_node.cpp
@@ -145,6 +145,17 @@
 
 //------------------------------------------------------------------------------
 
+void IsolationNode::addOpRule(OpRuleName_t i_opName, OpRuleType_t i_opType,
+                              RegisterId_t i_regId)
+{
+    std::pair<OpRuleType_t, RegisterId_t> tmpPair = {i_opType, i_regId};
+    auto ret = iv_op_rules.emplace(i_opName, tmpPair);
+
+    HEI_ASSERT(ret.second || ret.first->second == tmpPair);
+}
+
+//------------------------------------------------------------------------------
+
 std::vector<const IsolationNode*> IsolationNode::cv_isolationStack{};
 
 //------------------------------------------------------------------------------
diff --git a/src/isolator/hei_isolation_node.hpp b/src/isolator/hei_isolation_node.hpp
index d88ad02..9043f1d 100644
--- a/src/isolator/hei_isolation_node.hpp
+++ b/src/isolator/hei_isolation_node.hpp
@@ -110,6 +110,12 @@
      */
     std::map<BitPosition_t, const ConstPtr> iv_children;
 
+    /**
+     * This map is used to store the write operation rules for the isolation
+     * node as defined in the Chip Data Files.
+     */
+    std::map<OpRuleName_t, std::pair<OpRuleType_t, RegisterId_t>> iv_op_rules;
+
   public: // Member functions
     /**
      * @brief  Finds all active attentions on this node. If an active bit is a
@@ -151,8 +157,8 @@
      * This is only intended to be used during initialization of the isolator.
      * Will assert that a rule has not already been defined for this type.
      *
-     * @param The target attention type.
-     * @param The rule for this attention type.
+     * @param i_attnType The target attention type.
+     * @param i_rule The rule for this attention type.
      */
     void addRule(AttentionType_t i_attnType, Register::ConstPtr i_rule);
 
@@ -163,11 +169,24 @@
      * This is only intended to be used during initialization of the isolator.
      * Will assert that nothing has already been defined for this bit.
      *
-     * @param The target bit on this node.
-     * @param The child node to analyze for the given bit.
+     * @param i_bit The target bit on this node.
+     * @param i_child The child node to analyze for the given bit.
      */
     void addChild(BitPosition_t i_bit, ConstPtr i_child);
 
+    /**
+     * @brief Adds a new write operation for the isolation node.
+     *
+     * This is only intended to be used during initialization of the isolator.
+     * Will assert that nothing has already been defined for this type.
+     *
+     * @param i_opName The name of the operation.
+     * @param i_opType The type of the operation.
+     * @param i_regId The ID of the register to be written.
+     */
+    void addOpRule(OpRuleName_t i_opName, OpRuleType_t i_opType,
+                   RegisterId_t i_regId);
+
     /** @return The node ID. */
     NodeId_t getId() const
     {
