diff --git a/cnn_mapping/cost_model.py b/cnn_mapping/cost_model.py
index a230bc2d9e5cdb3c7826a3aeb98da3f33da6f505..be3c259cc357bf45fcb37802509f391657f487d2 100644
--- a/cnn_mapping/cost_model.py
+++ b/cnn_mapping/cost_model.py
@@ -971,20 +971,45 @@ def get_cost(resource, point, layer, verbose=False):
         ''' List of total access of each buffer at level i'''
         if not isinstance(access_list[i][0], list):
             buffer_access = list(map(mul, access_list[i], layer_size))
-            total_cost += sum(buffer_access) * total_access_cost[i]
+            total_cost += (sum(buffer_access) * total_access_cost[i][0])
         else :
             for j in range(len(access_list[i])):
                 buffer_access = list(map(mul, access_list[i][j], layer_size))
                 total_cost += sum(buffer_access) * total_access_cost[i][j]   
 
     if verbose:
-        print('access_cost: ', total_access_cost)
-        print('access_list: ', access_list)
+        #print("total_access_cost", total_access_cost)
+        #print("access_list", access_list)
+
+        #print("layer_size",layer_size)
+
+        idx_adjust = 0
+        if len(total_access_cost) > 4:
+            idx_adjust = 1
+        
+        layer_access_cost = total_access_cost[:1 + idx_adjust] + total_access_cost[2 + idx_adjust:]
+        print('Layer_Access_Cost_[RegisterFile(s),Buffer,DRAM]_(pJ): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\
+                .format([item[0] for item in layer_access_cost], [item[1] for item in layer_access_cost], [item[2] for item in layer_access_cost]))
+        print('PE_Access_Cost_(pJ): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\
+                .format(total_access_cost[1 + idx_adjust][0], total_access_cost[1 + idx_adjust][1], total_access_cost[1 + idx_adjust][2]))
+
+        layer_num_access = access_list[:1 + idx_adjust] + access_list[2 + idx_adjust:]
+        print('Number_of_Accesses_to_[RegisterFile(s),Buffer,DRAM]_in_Layer: \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\
+                .format([item[0] for item in layer_num_access], [item[1] for item in layer_num_access], [item[2] for item in layer_num_access]))
+        print("Number_of_Accesses_to_[RegisterFile(s),Buffer,DRAM] PEs in Layer: \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}"\
+                .format(access_list[1 + idx_adjust][0], access_list[1 + idx_adjust][1], access_list[1 + idx_adjust][2]))
+        
         bank_size_list, block_size_list = get_block_sizes(num_levels, point, layer)
-        print('bank_size_list: ', bank_size_list) 
-        print('block_size_list: ', block_size_list)
-        print('layer_size: ', layer_size)
-        print('total cost: ', total_cost)
+        
+        #print("bank_size_list", bank_size_list)
+        #print("block_size_list", block_size_list)
+
+        print('Memory_Bank_Size_List_When_Parallelized/Unrolled_[RegisterFile(s),Buffer,DRAM]_(bytes): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\
+                .format([item[0] for item in bank_size_list], [item[1] for item in bank_size_list], [item[2] for item in bank_size_list])) 
+        print('Memory_Block_Size_List_When_NOT_Parallelized/Unrolled_[RegisterFile(s),Buffer,DRAM]_(bytes): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\
+                .format([item[0] for item in block_size_list], [item[1] for item in block_size_list], [item[2] for item in block_size_list]))
+        print('Layer_Size_(number_of_pixels): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'.format(layer_size[0], layer_size[1], layer_size[2]))
+        #print('total cost: ', total_cost)
    
     #return total_cost
     return total_cost, total_access_cost, access_list,layer_size
diff --git a/cnn_mapping/optimizer.py b/cnn_mapping/optimizer.py
index 3886d7aa684384eba79e6d04c986b6e4d03075f0..b814e36a2741ae7b4e84422d5b744b68d4bc9525 100644
--- a/cnn_mapping/optimizer.py
+++ b/cnn_mapping/optimizer.py
@@ -20,9 +20,9 @@ def opt_optimizer(resource, layer, hint=None, verbose=False):
     # assert total_cost == smallest_cost
 
     if verbose:
-        print("Optimal energy (pJ): ", smallest_cost)
-        print("Runtime (cycles):", perf)
-        print("Best mapping_point: ", best_mapping_point.loop_blockings, best_mapping_point.loop_partitionings, best_mapping_point.loop_orders)
+        print("Optimal_energy_(pJ): ", smallest_cost)
+        print("Runtime_(cycles):", perf)
+        #print("Best mapping_point: ", best_mapping_point.loop_blockings, best_mapping_point.loop_partitionings, best_mapping_point.loop_orders)
     return [smallest_cost, best_mapping_point, perf]
  
 def optimizer(resource, layer, hint=None, verbose=False):
@@ -49,7 +49,7 @@ def optimizer(resource, layer, hint=None, verbose=False):
     
     if verbose:
         print(smallest_cost)
-        print("Best mapping_point: ", best_mapping_point.loop_blockings, mapping_point.loop_partitionings, best_mapping_point.loop_orders)
+        #print("Best mapping_point: ", best_mapping_point.loop_blockings, mapping_point.loop_partitionings, best_mapping_point.loop_orders)
 
     return [smallest_cost, best_mapping_point] 
 
diff --git a/cnn_mapping/schedule.py b/cnn_mapping/schedule.py
index 9ef64450c89e638c43302c85c3dd1736ba07a019..c7f2111fd81e63df481f7292e6659035194aad77 100644
--- a/cnn_mapping/schedule.py
+++ b/cnn_mapping/schedule.py
@@ -25,8 +25,8 @@ class Schedule(object):
                 self.partition_loops.append(le.loop_table[l])
         else:
             self.partition_loops = partition_loops       
-
-        num_levels = len(list(schedule_hint.values())[0][0])
+        
+        num_levels = len(list(schedule_hint.values())[0])
         hint_para_index = {}
         for loop in schedule_hint:
             for level in range(num_levels):
diff --git a/cnn_mapping/utils.py b/cnn_mapping/utils.py
index b1d79b8d4da39311c3a67cc6bf003c7d348f2255..7482b3ad02c7d2017e019d78a365cbb92db64167 100644
--- a/cnn_mapping/utils.py
+++ b/cnn_mapping/utils.py
@@ -20,3 +20,24 @@ def print_loop_nest(point):
 
     print(order_lists, para_dims)
 
+def print_best_schedule(point):
+    loop_orders = list(zip(*point.loop_orders))
+    loop_blockings = list(zip(*point.loop_blockings))
+    loop_partitionings = list(zip(*point.loop_partitionings))
+    para_dims = point.para_loop_dim
+    num_level = len(loop_orders)
+    order_lists = []
+    for level in range(num_level):
+        print("\tLevel Number: {}".format(level))
+        order_list = [None] * le.NUM
+        for order in range(le.NUM):
+            if loop_blockings[level][order] != 1 or loop_partitionings[level][order] != 1 :
+                order_list[loop_orders[level][order]] = (le.table[order], 
+                                                        loop_blockings[level][order],
+                                                        loop_partitionings[level][order])
+                print("\t\tLoop Name: {}, Loop Bound: {}, Number of Unrolls: {}".format(le.table[order], loop_blockings[level][order], loop_partitionings[level][order])) 
+                
+        order_lists.append(order_list) 
+
+    #print(order_lists)
+
diff --git a/tools/run_optimizer.py b/tools/run_optimizer.py
index e4469e02e2e448e616d8c980fd80cf8d3b102f37..4a406f4038c5b086cb22842c7f6cfce0c915c1ad 100644
--- a/tools/run_optimizer.py
+++ b/tools/run_optimizer.py
@@ -14,12 +14,15 @@ def basic_optimizer(arch_info, network_info, schedule_info=None, basic=False, ve
     schedule = cm.Schedule.schedule(schedule_info) if schedule_info != None else None
     smallest_cost, best_mapping_point, perf = cm.optimizer.opt_optimizer(resource, layer, schedule, verbose)
     
-    level_costs = cm.cost_model.get_level_costs(resource, best_mapping_point, layer, verbose)
-    if verbose or basic:
-        print("best energy: ", smallest_cost)
-        print("cost for each level: ", level_costs) #TODO
-        print("best schedule: ")
-        print(cm.utils.print_loop_nest(best_mapping_point))
+    level_costs = cm.cost_model.get_cost(resource, best_mapping_point, layer, verbose)
+    #if verbose or basic:
+    if not verbose: 
+        print("Optimal_energy_(pJ): ", smallest_cost)
+    
+    #print("Cost for Each Level (pJ): ", level_costs) #TODO
+    print("Best_Schedule_(innermost_loop_to_outermost_loop): ")
+    cm.utils.print_best_schedule(best_mapping_point)
+
     return smallest_cost, perf
 
 
@@ -173,5 +176,5 @@ if __name__ == "__main__":
     elif args.type == "mem_explore_4":
         mem_explore_optimizer_4_level(arch_info, network_info, schedule_info, args.verbose)
     end = time.time()
-    print("elapsed time: ", (end-start))
+    print("Elapsed Time (s): ", round((end-start), 2))