From 8c507806d50860f59c193eb7694ac21104b2e837 Mon Sep 17 00:00:00 2001
From: Elizabeth <hashim.sharif91@gmail.com>
Date: Wed, 9 Oct 2019 00:29:03 -0500
Subject: [PATCH] Ported quantize method to python

---
 llvm/projects/soc_simulator/src/driver.py | 29 +++++++++++++----------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/llvm/projects/soc_simulator/src/driver.py b/llvm/projects/soc_simulator/src/driver.py
index 56e6006c9f..f9df2f32c4 100644
--- a/llvm/projects/soc_simulator/src/driver.py
+++ b/llvm/projects/soc_simulator/src/driver.py
@@ -58,8 +58,7 @@ def parse_tensor_layer_file(layer_filename):
     layer_file.close()
 
 # [layer_name][operation_name][cols] 
-# operation names need to be stored in order of insertion (use a list) 
-# defaultdict, value = lists of default dicts 
+# Operation names need to be stored in order of insertion 
 tensor_table = defaultdict(lambda: list(defaultdict(str)))
 
 def parse_tensor_table(table_filename): 
@@ -116,13 +115,13 @@ def is_promise(config_layer):
     return config_layer.split(' ')[0] < fp16_swing
 
 # NOTE smart_dma is always true
-def quantize(curr_layer, prev_layer, tensor, layer_data):
+def quantize(curr_layer, prev_layer, h2f_f2h_operation_ind, 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) 
+        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"]
@@ -131,16 +130,20 @@ def quantize(curr_layer, prev_layer, tensor, layer_data):
     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
+    # Get h2f/f2h data using the first tensor operation in the layer
+    # (which is why order matters in the tensor table)
+    tensor_op_row = tensor_table[layer_name][h2f_f2h_operation_ind]  
+    if curr_layer == ApproxTypes.FP32:
+	    return tensor_op_row["h2f_time"], tensor_op_row["h2f_energy"]
+    elif curr_layer == ApproxTypes.FP16:
+        return tensor_op_row["f2h_time"], tensor_op_row["f2h_energy"]
+    assert(False) # Error: Should never reach this section
+
 
 def run_simulations(config_filename, results_filename):
     config_file = open(config_filename, "r")
@@ -161,7 +164,9 @@ def run_simulations(config_filename, results_filename):
             if is_promise(config_layer):
                 print("Running layer %s on PROMISE" % layer_data["Name"])
                 curr_layer = ApproxTypes.PROMISE
+                quant_time, quant_energy = quantize(curr_layer, prev_layer, 0, layer_data)
                 
+                # Compute 
 
             else:
                 pass
-- 
GitLab