with Text_IO; use Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Strings.Bounded; use Ada.Strings.Bounded; with Ada.Finalization; with Task_Set; use Task_Set; with Scheduling_Analysis; use Scheduling_Analysis; with Tasks; use Tasks; with Tasks.Extended; use Tasks.Extended; with stacks; with Unchecked_Deallocation; with Integer_Arrays; use Integer_Arrays; with Cache_Set; use Cache_Set; with Cache_Block_Set; use Cache_Block_Set; with Cache_Access_Profile_Set; use Cache_Access_Profile_Set; package Priority_Assignment.Utility is -------------------------------------------- --STEPS IN THE OPA -- -------------------------------------------- --Calculate the Pi - Hyper Period level i function Calculate_Pi (priority_level : in Integer; my_tasks : in Tasks_Set) return Integer; --Calculate Hyper_Period function Calculate_H (my_tasks : in Tasks_Set) return Integer; --Refine the offset following Theorem Refine in Audsley's paper procedure Refine_Offset (a_task : in Generic_Task_Ptr; my_tasks : in Tasks_Set; refined_tasks : out Tasks_Set); --Calculate the Beta, Eta Set for OPA procedure Calculate_Task_Release_Records_Table (t_start : in Integer; t_end : in Integer; a_task : in out Generic_Task_Ptr; my_tasks : in out Tasks_Set; a_task_release_records_table : out Task_Release_Records_Table); -------------------------------------------- -- A data structure to store UCBs and ECBs of task -- Converted from Cache Access Profile -------------------------------------------- type Task_UCB_ECB is record Task_Name : Unbounded_String; Task_Index : Integer; UCBs : Integer_Array; CRPD_UCB : Integer; ECBs : Integer_Array; CRPD_ECB : Integer; end record; procedure Initialize (My_Task_UCB_ECB : in out Task_UCB_ECB; Task_Name : in Unbounded_String; Task_Index : in Integer := 0; UCBs : in Integer_Array; CRPD_UCB : in Integer := 0; ECBs : in Integer_Array; CRPD_ECB : in Integer := 0); type Task_UCB_ECB_Array is array (Natural range <>) of Task_UCB_ECB; type Task_UCB_ECB_Array_Ptr is access Task_UCB_ECB_Array; --Calculate the Beta, Eta Set for OPA CRPD procedure Calculate_Task_Release_Records_Table (t_start : in Integer; t_end : in Integer; a_task : in Generic_Task_Ptr; my_tasks : in out Tasks_Set; a_tuea : in Task_UCB_ECB_Array_Ptr; a_trrt : out Task_Release_Records_Table_Ptr); function Get_Task_CRPD_ECB (A_Task_UCB_ECB_Array_Ptr : in Task_UCB_ECB_Array_Ptr; Task_Name : in Unbounded_String) return Integer; function Get_Task_CRPD_UCB (A_Task_UCB_ECB_Array_Ptr : in Task_UCB_ECB_Array_Ptr; Task_Name : in Unbounded_String) return Integer; procedure CAP_to_TUEA (my_tasks : in Tasks_Set; my_cache_access_profiles : in Cache_Access_Profiles_Set; a_task_ucb_ecb_array : in out Task_UCB_ECB_Array_Ptr); -------------------------------------------- -- Data structure and functions to solve transitive closure problem -------------------------------------------- type Boolean_Arr_2D is array (Integer range <>, Integer range <>) of Boolean; type Boolean_Arr_2D_Ptr is access Boolean_Arr_2D; procedure Free is new Unchecked_Deallocation (Boolean_Arr_2D, Boolean_Arr_2D_Ptr); procedure Warshall_Algorithm (warshall_array :in out Boolean_Arr_2D_Ptr; size : in Integer); -------------------------------------------- -- Data structure and functions to solve binomial coefficient problem -------------------------------------------- type IAs is array(natural range <>) of Integer_Array; type IAs_Ptr is access IAs; procedure Initialize(a_ias : in out IAs_Ptr); procedure Add(a_ias: in out IAs_Ptr; a_ia : in Integer_Array); procedure Free is new Unchecked_Deallocation (IAs, IAs_Ptr); function Compute_CRPD_Potential_Preempted (sets : in IAs_Ptr; k : in Integer; n : in Integer) return Integer; -------------------------------------------- -- Data structure and functions to solve binomial coefficient problem -------------------------------------------- procedure Get_EUCBs (a_task_ucb_ecb_array : in Task_UCB_ECB_Array_Ptr; preempting_task : in Unbounded_String; preempted_task : in Unbounded_String; arr_eucbs : out Integer_Array); --Cache related preemption delay cache block procedure Check_CCB (a_task_ucb_ecb_array : in Task_UCB_ECB_Array_Ptr; preempting_task : in Unbounded_String; preempted_task : in Unbounded_String; n_ccb : out Natural); function Get_CRPD_by_NCB (n_ucb_ecb : in Integer) return Integer; -------------------------------------------- -- -------------------------------------------- type Task_Release_Record_Ext; type Task_Release_Record_Ext_Ptr is access all Task_Release_Record_Ext'Class; type Task_Release_Record_Ext is new Task_Release_Record with record UCBs : Integer_Array; ECBs : Integer_Array; UCBs_In_Cache : Integer_Array; end record; -------------------------------------------- -- Function used to perform scheduling simulation -------------------------------------------- procedure Fill_Tasks_UCBs_In_Cache (a_trr : in out Task_Release_Record_Ext_Ptr); end Priority_Assignment.Utility;