with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Systems; use Systems; with CFG_Nodes; use CFG_Nodes; with CFG_Nodes; use CFG_Nodes.CFG_Nodes_Table_Package; with CFG_Nodes.Extended; use CFG_Nodes.Extended; with CFG_Node_Set; use CFG_Node_Set; with Integer_Arrays; use Integer_Arrays; with Tasks; use Tasks; with Scheduling_Analysis; use Scheduling_Analysis; with CFG_Node_Set.Basic_Block_Set; use CFG_Node_Set.Basic_Block_Set; with Basic_Blocks; use Basic_Blocks; with Basic_Blocks; use Basic_Blocks.Basic_Blocks_Table_Package; with CFG_Edge_Set; use CFG_Edge_Set; with CFGs; use CFGs; with Caches; use Caches; with Tables; with Call_Framework_Interface; use Call_Framework_Interface; Package Basic_Block_Analysis is ------------------------------------------------------ -- Analysis based on the algorithm in: -- Lee, Chang-Gun, et al. -- "Analysis of cache-related preemption delay in fixed-priority preemptive scheduling." -- Computers, IEEE Transactions on 47.6 (1998): 700-713. ------------------------------------------------------ ------------------------------------------------------ -- EXCEPTION ------------------------------------------------------ --Raised when the Input Data to perform cache access profile computation is invalid Invalid_Input_Data : exception; ------------------------------------------------------ -- ENTRY POINT ------------------------------------------------------ procedure Compute_Cache_Access_Profile (Sys : in out System; Task_Name : in Unbounded_String; A_Cache_Access_Profile : out Cache_Access_Profile_Ptr); ------------------------------------------------------ -- ------------------------------------------------------ -- Calculate the GEN Set for each basic block -- The Gen for calculation of RMB and LMB is calculated separately. -- They are GenCBR and GenCBL, respectively. procedure Calculate_GEN (my_basic_blocks : in out Basic_Blocks_Set; cache_size : in Integer; cache_block_size : in Integer); -- Calculate the RMB set for each basic block procedure Calculate_RMB (my_basic_blocks : in out Basic_Blocks_Set; number_cache_block : in Integer); -- Calculate the LMB set for each basic block procedure Calculate_LMB (my_basic_blocks : in out Basic_Blocks_Set; number_cache_block : in Integer); -- Do the intersection to find the number of useful blocks procedure Intersect_UsefulBlocks (my_basic_blocks : in out Basic_Blocks_Set; number_cache_block : in Integer); -- Methods that call the Calculate_GEN,Calculate_RMB,Calculate_LMB, -- and Intersect_UsefulBlocks. procedure Calculate_UsefulBlocks (my_basic_blocks : in out Basic_Blocks_Set; cache_size : in Integer; line_size : in Integer); -- procedure Calculate_Cost_Table (my_cfg_nodes : in out CFG_Nodes_Set; my_cfg_edges : in out CFG_Edges_Set; cache_blocks : in Cache_Blocks_Table; cache_size : in Integer; line_size : in Integer; block_reload_time : in Integer; a_cache_access_profile : in out Cache_Access_Profile_Ptr; cost_arr : out Integer_Array); -- procedure Calculate_Task_Cache_Utilization (my_basic_blocks : in out Basic_Blocks_Table; cache_size : in Integer; cache_block_size : in Integer; cache_utilization_array : in out Integer_Array); End Basic_Block_Analysis;