diff --git a/llvm/projects/soc_simulator/src/driver.py b/llvm/projects/soc_simulator/src/driver.py
index 7639ff1554fbeeccb7978b6f7d05dd0a2b16521d..56e6006c9f4a1fa9eecaa3e85568be9e44bfc24a 100644
--- a/llvm/projects/soc_simulator/src/driver.py
+++ b/llvm/projects/soc_simulator/src/driver.py
@@ -57,9 +57,10 @@ def parse_tensor_layer_file(layer_filename):
         tensor_layers.append(tensor_layer)
     layer_file.close()
 
-# should this be a nested dict of dicts?
-# [layer_name][operation_name][cols]
-tensor_table = defaultdict(build_nested_default_dict)
+# [layer_name][operation_name][cols] 
+# operation names need to be stored in order of insertion (use a list) 
+# defaultdict, value = lists of default dicts 
+tensor_table = defaultdict(lambda: list(defaultdict(str)))
 
 def parse_tensor_table(table_filename): 
     if not os.path.isfile(table_filename):
@@ -67,7 +68,6 @@ def parse_tensor_table(table_filename):
         exit(1)
     table_file = open(table_filename, "r")
     line = table_file.readline().strip()
-    print(line)
 
     while line:
         # Line here MUST be a header or there's a bug 
@@ -79,22 +79,68 @@ def parse_tensor_table(table_filename):
         num_ops = int(header_contents[1])
         col_names = header_contents[2:]
 
+        layer_operations = []
+
         # Go through all operations in the layer
         for op_count in range(num_ops):
+            operation_data = defaultdict(str)
+
             line = table_file.readline().strip()
             op_data = line.split(' ')
             op_name = op_data[0]
+            operation_data["Name"] = op_name
 
             # Number of data items (#s) needs to match up with the # of cols 
             assert(len(op_data) - 1 == len(col_names)) 
 
             # Go through all data items (each col element) per operation 
             for i in range(len(col_names)):
-                tensor_table[layer_name][op_name][col_names[i]] = op_data[i + 1]
+                operation_data[col_names[i]] = op_data[i + 1]
 
+            layer_operations.append(operation_data)
+
+        tensor_table[layer_name] = layer_operations
         line = table_file.readline().strip()
     table_file.close()
-    
+   
+fp16_swing = 8
+iterations = 10
+
+class ApproxTypes:
+    FP16 = 0
+    FP32 = 1
+    PROMISE = 2
+
+def is_promise(config_layer):
+    # TODO overhead in call to split?
+    return config_layer.split(' ')[0] < fp16_swing
+
+# NOTE smart_dma is always true
+def quantize(curr_layer, prev_layer, tensor, layer_data):
+    if curr_layer == prev_layer or curr_layer == ApproxTypes.PROMISE \
+                or prev_layer == ApproxTypes.PROMISE: # No quantization needed
+        return (0.0, 0.0) 
+   
+    size = None
+    layer_name = layer_data["Name"]
+    if is_conv(layer_name):
+        size = layer_data["N"] * layer_data["Cin"] * layer_data["H"] * layer_data["W"] \
+				+ layer_data["Cout"] * layer_data["Cin"] * layer_data["Kh"] * layer_data["Kw"]
+    elif is_fc(layer_name):
+        size = layer_data["RA"] * layer_data["CA"] + layer_data["RB"] * layer_data["CB"]
+    elif not is_nml(layer_name):
+		print("ERROR: Invalid layer name %s" % layer_name)
+		exit(1)
+	
+	# NOTE: Ignoring logic where curr == promise or prev == promise bc 
+	# smartDMA is always true so we'd return near the beginning of the method
+	# Converting between fp16 and fp32
+	#info = tensor_table[layer_name]
+# [layer_name][operation_name][cols]
+
+# [layer name][operation number] = list of values
+# we need to get the layer number, the first operation in that layer --> need to change table to store order
+# then the h2f and f2h values
 
 def run_simulations(config_filename, results_filename):
     config_file = open(config_filename, "r")
@@ -106,13 +152,19 @@ def run_simulations(config_filename, results_filename):
 
     for config in config_file:
         config_layers = config.strip().split(',')
-        prev = "FP32" # TODO??!
-        curr = None
-
-        for layer_ind, curr_layer in enumerate(config_layers):
-            # TODO tensor_layers needs to be a list?
-            curr_tensor_layer = tensor_layers[layer_ind] 
-
+        prev_layer = ApproxTypes.FP32
+        curr_layer = None
+
+        for layer_ind, config_layer in enumerate(config_layers): # level
+            layer_data = tensor_layers[layer_ind]  # layer
+           
+            if is_promise(config_layer):
+                print("Running layer %s on PROMISE" % layer_data["Name"])
+                curr_layer = ApproxTypes.PROMISE
+                
+
+            else:
+                pass
         # for each config file line --> parse the comma separated voltage swing levels
         # recall: each line = a configuration that works
         # for each level
@@ -139,4 +191,4 @@ if __name__ == "__main__":
         exit(1)
     '''
     parse_tensor_layer_file("/home/nvidia/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/build_mobilenet/mobilenet_layers.txt")
-    #parse_tensor_table("/home/nvidia/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/build_pldi/mobilenet_results/mobilenet_tensors.txt")
+    parse_tensor_table("/home/nvidia/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/build_pldi/mobilenet_results/mobilenet_tensors.txt")