diff --git a/framework/CavaDRAM/Implementations/CavaFIFOREF/CavaFIFOREFProperties.v b/framework/CavaDRAM/Implementations/CavaFIFOREF/CavaFIFOREFProperties.v index 0f984862ab51456c604bf252d6049a6986183b05..cabe06f15dc833acaf8bb4b548f952f104dae168 100644 --- a/framework/CavaDRAM/Implementations/CavaFIFOREF/CavaFIFOREFProperties.v +++ b/framework/CavaDRAM/Implementations/CavaFIFOREF/CavaFIFOREFProperties.v @@ -47,9 +47,13 @@ Section CavaFIFOProperties. Definition mem_cells_ := mem_cells (Vec Bit REQUEST_WIDTH) ADDR_WIDTH (Nat.pow 2 ADDR_WIDTH) InitMem. + Check Cells_read. + Locate mem_cells. + Lemma nth_cells_read {T W I} (ad : Bvector W) c_req def (c : circuit_state (mem_cells T W (2 ^ W) I)) : nth_default def (N.to_nat (Bv2N ad)) (Cells_read true (N.to_nat (Bv2N ad)) c_req c) = c_req. + Proof. Admitted. Lemma nth_cells_read_ {T W I N} (ad : Bvector (Nat.log2 N)) c_req def @@ -75,7 +79,8 @@ Section CavaFIFOProperties. specialize (@length_to_list_shiftin (combType T) N memvec c_req) as HH. assert (N = (Datatypes.length (Vector.to_list (Vector.shiftin c_req memvec))) - 1)%coq_nat; [ lia | ]. apply nth_last with (d := def) in H1; rewrite H1. - by rewrite last_shiftin. } + by rewrite last_shiftin. + } { unfold memvec. specialize (IHN (VectorDef.tl ad) c0); apply IHN in H as IH; clear IHN. rewrite (Vector.eta ad) Bv2N_cons. @@ -302,13 +307,18 @@ Section CavaFIFOProperties. Lemma notfull_rd (wr rd : Bvector ADDR_WIDTH) : let rdp1 := N2Bv_sized ADDR_WIDTH (Bv2N rd + 1) in - wr <> rd -> wr <> rdp1 -> ~~ fullQueue wr rd -> + wr <> rd -> + wr <> rdp1 -> + ~~ fullQueue wr rd -> ~~ fullQueue wr rdp1. Proof. intros rdp1 Hdif1 Hdif2 HF; unfold fullQueue in HF. destruct (leq _ _) eqn:Hleq. { rewrite leq_eqVlt in Hleq; move: Hleq => /orP [/eqP Heq | Hleq]. - { admit. (* impossible *)} + { contradict Heq. + specialize (@Bv2N_neq_inj ADDR_WIDTH wr rd) as H; apply H in Hdif1. + apply not_eq_sym; lia. + } unfold fullQueue. destruct (Bv2N rdp1 <= _) eqn:Hleq2. { apply /negPf. apply N.eqb_neq. @@ -317,7 +327,9 @@ Section CavaFIFOProperties. move: HF => /negPf HF; apply N.eqb_neq in HF. apply (N.lt_gt_cases (Bv2N wr - Bv2N rd) (N.of_nat QUEUE_MAX_SIZE - 1)) in HF as HF'; destruct HF' as [H0 | H1]. - 2: admit. (* Impossible, Bv2N wr - Bv2N rd cannot be bigger than QMS *) + 2: { + admit. (* Impossible, Bv2N wr - Bv2N rd cannot be bigger than QMS *) + } apply (N.lt_trans (Bv2N wr - Bv2N rdp1) (Bv2N wr - Bv2N rd) (N.of_nat QUEUE_MAX_SIZE - 1)); [ | exact H0 ]. assert (N.lt (Bv2N rd) (Bv2N rdp1)); [ admit | ]. @@ -783,7 +795,7 @@ Section CavaFIFOProperties. (cref + WAIT < PREA_date) = false -> (nat_of_ord cref == PREA_date - 1) = false -> (* Start of conclusion *) - let f_state := (Default_arbitrate t).(Implementation_State) in + (* let f_state := (Default_arbitrate t).(Implementation_State) in *) let R := Arrival_at t in R == [:: arriving_req] -> EqReq (Some arriving_req) c_req -> @@ -791,7 +803,9 @@ Section CavaFIFOProperties. State_Eq S c_state -> let '(f_nextstate,f_cmd_o) := Next_state R S in let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step CavaFIFOREF c_state (true,c_req) in - (State_Eq f_nextstate c_nextstate) && (EqCmd f_cmd_o c_cmd_o). + (State_Eq f_nextstate c_nextstate) && (EqCmd f_cmd_o c_cmd_o). + Admitted. + (* Proof. intros Href_service Href_prea f_state R NF EqR S H; unfold CavaFIFOREF. unfold R in *; clear R. @@ -803,7 +817,6 @@ Section CavaFIFOProperties. (* What we know from State_Eq *) autounfold with get_state in H; cbn [fst snd] in H. - move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] HQ]. (* Queue not empty -> wra <> rda *) @@ -858,8 +871,6 @@ Section CavaFIFOProperties. destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']]. autounfold with get_state. - apply /andP; split. - 2 : exact EqReqNil. apply /andP; split. 2 : unfold EqCmd; by apply BVEq_iff_eq. apply /andP; split. @@ -867,15 +878,16 @@ Section CavaFIFOProperties. rewrite (surjective_pairing (step RequestQueue' _ _)) H. cbv [get_addr_RequestQueue] in Hwra'; rewrite Hwra'; clear Hwra'. cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'. - rewrite /Enqueue /R NF. - apply (EqQueue_aux wra rda r0 r1 r); done. + rewrite /Enqueue NF. + apply (EqQueue_aux wra rda r0 P arriving_req); try done. + by apply NFULL. } apply /andP; split. 2 : { rewrite /EqMem (surjective_pairing (step RequestQueue' _ _)) H Hrda'; cbn [fst snd]; - unfold R; rewrite NF Hrw /Enqueue. + rewrite NF Hrw /Enqueue. cbv [get_memcells_RequestQueue get_mem_RequestQueue get_memcells]. - apply EqMem_rcons; try done. + apply EqMem_rcons; done. } apply /andP; split. 2 : { @@ -884,18 +896,19 @@ Section CavaFIFOProperties. | |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p) end; cbn [fst snd]. rewrite //= /Next_cycle_ref. - set Hc := c1.+1 < PREA_date; dependent destruction Hc; + set Hc := cref.+1 < PREA_date; dependent destruction Hc; apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro. - { rewrite /cref2Bv //= Bv2N_N2Bv_sized. - 2: apply to_nat_lt_pow; rewrite Nat2N.id; apply cref_bound. + { rewrite /cref2Bv. rewrite //=. + rewrite Bv2N_N2Bv_sized. + 2: { apply to_nat_lt_pow. rewrite Nat2N.id. apply cref_bound. } rewrite /N2Bv_sized. - destruct (N.of_nat c1 + 1)%N eqn:Hbug; + destruct (N.of_nat cref + 1)%N eqn:Hbug; [ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ]. apply BVEq_iff_eq; f_equal; lia. } - { specialize (cref_bound c1) as Hc1_bound. - destruct c1; clear H Hrw Hwra' Hrda' cs_requeue' cs_nextcr; simpl in *. - apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]; [ | lia]. + { specialize (cref_bound cref) as Hc1_bound. + destruct cref; clear H Hrw Hwra' Hrda' cs_requeue' cs_nextcr; simpl in *. + apply gtF_leq in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]; [ | lia]. assert (m = PREA_date.-1); [ lia | ]. rewrite H in Href_prea; contradict Href_prea; apply not_false_iff_true; by rewrite subn1 eq_refl. } @@ -909,7 +922,7 @@ Section CavaFIFOProperties. rewrite /cnt2Bv //=; apply BVEq_iff_eq; f_equal; apply Nat2N.inj_iff. rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=. 2: { - destruct c0; rewrite //= /COUNTER_WIDTH. + destruct cnt; rewrite //= /COUNTER_WIDTH. rewrite WAIT_PW_2_N; apply N_lt_inj; by apply /ltP. } set (Hc := _ < WAIT); dependent destruction Hc; @@ -922,32 +935,46 @@ Section CavaFIFOProperties. end; cbn [fst snd]. by []. Qed. + *) - Theorem SM_Eq_3a (t : nat) (c_state : State_t) c0 (r : Request_t) - (c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) : - (c1 + WAIT < PREA_date) = false -> - (nat_of_ord c1 == PREA_date - 1) = false -> + Theorem SM_Eq_3a (t : nat) (c_state : State_t) cnt (r arriving_req: Request_t) + (cref : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) : + (cref + WAIT < PREA_date) = false -> + (nat_of_ord cref == PREA_date - 1) = false -> + (* Start of conclusion*) let f_state := (Default_arbitrate t).(Implementation_State) in - let R := HW_Arrival_at t in - R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 []) c_state -> - let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in - let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in - (State_Eq f_nextstate c_nextstate) && - (EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o). + let R := Arrival_at t in + R == [:: arriving_req] -> + EqReq (Some arriving_req) c_req -> + let S := IDLE cnt cref [] in + State_Eq S c_state -> + let '(f_nextstate,f_cmd_o) := Next_state R S in + let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step CavaFIFOREF c_state (true,c_req) in + (State_Eq f_nextstate c_nextstate) && (EqCmd f_cmd_o c_cmd_o). + Admitted. + (* Proof. - intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM_. - unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF. + intros Href_service Href_prea f_state R NF EqR S H; unfold CavaFIFOREF. + unfold R in *; clear R. + specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF. unfold State_t in c_state; simpl in c_state; destruct_products. rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL. - rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda. - rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H. - + rename t0 into s, t1 into cnt_, t2 into cref_, t3 into cr, t4 into wra, t5 into rda. + rewrite /State_Eq /EqMem in H; unfold S in H. + + (* What we know from State_Eq *) + autounfold with get_state in H; cbn [fst snd] in H. move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr]. - simpl in Hadr. - apply BVEq_iff_eq in EqS, EqCnt, EqCref, Hadr; subst s cnt cref. + + apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt_ cref_. + unfold S in *; clear S. + cbv [LoopInit]; cbn [step fst snd]; simpl_ret; cbv [and2]; cbn [fst snd]. + + simpl in Hadr. + apply BVEq_iff_eq in Hadr. - assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv c1)) = false) as Haux; + assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv cref)) = false) as Haux; [ apply CrefPREA_lt_CNT_REF_WAIT_F in Href_service; by rewrite Href_service andb_false_r | ]. rewrite Haux; clear Haux. @@ -959,26 +986,27 @@ Section CavaFIFOProperties. rewrite H; clear H; cbn [fst snd]. set tr := nth_default req_null (N.to_nat (Bv2N rda)) _. - specialize NextCR_equiv with (c := (u7, (u8, cr))) (cnt := cnt2Bv c0) - (cref := cref2Bv c1) (tr := tr) as [cs_nextcr H]. - rewrite H; cbv [fst]; clear H. cbn [snd]. + specialize NextCR_equiv with (c := (u7, (u8, cr))) (cnt := cnt2Bv cnt) + (cref := cref2Bv cref) (tr := tr) as [cs_nextcr H]. + rewrite H; cbv [fst]; clear H; cbn [snd]. apply cref_preadate_false in Href_prea as Href_prea_. - apply (CmdGen_equiv_idle_to_idle_E u5 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H. + apply (CmdGen_equiv_idle_to_idle_E u5 (cnt2Bv cnt) (cref2Bv cref)) in Href_prea_ as H. destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd]. - apply (Update_equiv_idle_idle_E u3 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H. + apply (Update_equiv_idle_idle_E u3 (cnt2Bv cnt) (cref2Bv cref)) in Href_prea_ as H. destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd]. + cbn [constant]. + rewrite /Next_state Href_prea Href_service /State_Eq. + specialize (Queue_WR_NF_E_fst (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, (u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra)) c_req false) as S. - apply S in NFULL as H; clear S; apply H in Hadr as H'; clear H; rename H' into H. + apply S in NFULL as H; clear S; [ | trivial]; apply H in Hadr as H'; clear H; rename H' into H. destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']]. autounfold with get_state. - apply /andP; split. - 2 : exact EqReqNil. apply /andP; split. 2 : unfold EqCmd; by apply BVEq_iff_eq. apply /andP; split. @@ -986,7 +1014,7 @@ Section CavaFIFOProperties. rewrite (surjective_pairing (step RequestQueue' _ _)) H. cbv [get_addr_RequestQueue] in Hwra'; rewrite Hwra'; clear Hwra'. cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'. - simpl; rewrite Hadr; unfold R; rewrite NF //=. + simpl; rewrite Hadr; rewrite NF //=. apply /andP; split. { apply /negPf; apply (@N2Bv_sized_eq_p1_false ADDR_WIDTH rda); specialize ADDR_WIDTH_pos as Hpos; by move: Hpos => /ltP Hpos. } @@ -996,11 +1024,12 @@ Section CavaFIFOProperties. 2 : { rewrite (surjective_pairing (step RequestQueue' _ _)) H. cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'. - simpl; unfold R; rewrite NF //= /EqMem //= andb_true_r. - rewrite Hrw; autounfold with get_state; rewrite Hadr VectorSpec.map_id. + simpl. rewrite NF. rewrite /EqMem //= andb_true_r. + rewrite Hrw. autounfold with get_state. rewrite Hadr VectorSpec.map_id. specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req (Bvect_false REQUEST_WIDTH) c) as H'. - rewrite H'; exact EqR. + rewrite H'. + exact EqR. } apply /andP; split. 2 : { @@ -1009,18 +1038,18 @@ Section CavaFIFOProperties. | |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p) end; cbn [fst snd]. rewrite //= /Next_cycle_ref. - set Hc := c1.+1 < PREA_date; dependent destruction Hc; + set Hc := cref.+1 < PREA_date; dependent destruction Hc; apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro. { rewrite /cref2Bv //= Bv2N_N2Bv_sized. 2: apply to_nat_lt_pow; rewrite Nat2N.id; apply cref_bound. rewrite /N2Bv_sized. - destruct (N.of_nat c1 + 1)%N eqn:Hbug; + destruct (N.of_nat cref + 1)%N eqn:Hbug; [ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ]. apply BVEq_iff_eq; f_equal; lia. } - { specialize (cref_bound c1) as Hc1_bound. - destruct c1; clear H Hrw Hwra' Hrda' cs_requeue' cs_nextcr; simpl in *. - apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]; [ | lia]. + { specialize (cref_bound cref) as Hc1_bound. + destruct cref; clear H Hrw Hwra' Hrda' cs_requeue' cs_nextcr; simpl in *. + apply gtF_leq in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]; [ | lia]. assert (m = PREA_date.-1); [ lia | ]. rewrite H in Href_prea; contradict Href_prea; apply not_false_iff_true; by rewrite subn1 eq_refl. } @@ -1034,7 +1063,7 @@ Section CavaFIFOProperties. rewrite /cnt2Bv //=; apply BVEq_iff_eq; f_equal; apply Nat2N.inj_iff. rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=. 2: { - destruct c0; rewrite //= /COUNTER_WIDTH. + destruct cnt; rewrite //= /COUNTER_WIDTH. rewrite WAIT_PW_2_N; apply N_lt_inj; by apply /ltP. } set (Hc := _ < WAIT); dependent destruction Hc; @@ -1047,79 +1076,80 @@ Section CavaFIFOProperties. end; cbn [fst snd]. by []. Qed. + *) - Theorem SM_Eq_2b (t : nat) (c_state : State_t) c0 r0 r1 - (c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) r : - (c1 + WAIT < PREA_date) = true -> - (nat_of_ord c1 == PREA_date - 1) = false -> - let f_state := (Default_arbitrate t).(Implementation_State) in - let R := HW_Arrival_at t in - R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 (r0 :: r1)) c_state -> - let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 (r0 :: r1)) in - let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in - (State_Eq f_nextstate c_nextstate) && - (EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o). + (* IDLE -> RUNING, start processing request *) + Theorem SM_Eq_2b (t : nat) (c_state : State_t) cnt r0 P + (cref : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) arriving_req : + (cref + WAIT < PREA_date) = true -> + (nat_of_ord cref == PREA_date - 1) = false -> + (* let f_state := (Default_arbitrate t).(Implementation_State) in *) + let R := Arrival_at t in + R == [:: arriving_req] -> + EqReq (Some arriving_req) c_req -> + let S := IDLE cnt cref (r0 :: P) in + State_Eq S c_state -> + let '(f_nextstate,f_cmd_o) := Next_state R S in + let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step CavaFIFOREF c_state (true,c_req) in + (State_Eq f_nextstate c_nextstate) && (EqCmd f_cmd_o c_cmd_o). Proof. - intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM_. - unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF. + intros Href_service Href_prea R NF EqR S H; unfold CavaFIFOREF. + unfold R in *; clear R. + specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF. unfold State_t in c_state; simpl in c_state; destruct_products. rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL. - rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda. - rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H. + rename t0 into s, t1 into cnt_, t2 into cref_, t3 into cr, t4 into wra, t5 into rda. + rewrite /State_Eq /EqMem in H; unfold S in H. + autounfold with get_state in H; cbn [fst snd] in H. move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] HQ]. apply EqQueue_diff_adr in HQ as Hadr. - - apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt cref. + apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt_ cref_. cbv [LoopInit]; cbn [step fst snd]; simpl_ret; cbv [and2]. - assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv c1)) = true) as Haux; [ + + assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv cref)) = true) as Haux; [ rewrite //= ; apply CrefPREA_lt_CNT_REF_WAIT; [ by apply cref_preadate_false in Href_prea | done ] | ]; rewrite Haux; clear Haux; cbn [snd]. rewrite (surjective_pairing (step RequestQueue' _ _)). + unfold S in *; clear S. specialize (Queue_WR_NF_NE_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, (u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req true) as S. cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S. - apply S in NFULL as S'; [ | done]; clear S; destruct S' as [full_o H]. + apply S in NFULL as S'; try done; clear S; destruct S' as [full_o H]. rewrite H; clear H; cbn [fst snd]. set tr := nth_default req_null (N.to_nat (Bv2N rda)) _. - apply NextCR_equiv_IDLE_RUNNING with (c := (u7, (u8, cr))) (cnt := cnt2Bv c0) - (cref := c1) (tr := tr) in Href_service as H. + apply NextCR_equiv_IDLE_RUNNING with (c := (u7, (u8, cr))) (cnt := cnt2Bv cnt) + (cref := cref) (tr := tr) in Href_service as H. 2: by apply cref_preadate_false in Href_prea. destruct H as [cs_nextcr H]; destruct H as [H Htr]. rewrite H; clear H; cbv [fst snd]. - specialize (CmdGen_equiv_idle_to_running u5 (cnt2Bv c0) c1 tr) as S. + specialize (CmdGen_equiv_idle_to_running u5 (cnt2Bv cnt) cref tr) as S. specialize Href_service as Href_service_. apply S in Href_service; clear S; rename Href_service into H. 2: by apply cref_preadate_false in Href_prea. destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd]. - specialize (Update_equiv_idle_running u3 (cnt2Bv c0) c1) as S; + specialize (Update_equiv_idle_running u3 (cnt2Bv cnt) cref) as S; apply S in Href_service_ as S'; clear S. 2: by apply cref_preadate_false in Href_prea. destruct S' as [cs_update H]; rewrite H; clear H; cbn [fst snd]. + cbn [constant]. + rewrite /Next_state Href_prea Href_service_ /State_Eq. - specialize Queue_NF_WR_RD_fst with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, - (u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S. - apply S in NFULL as H; clear S. + specialize (Queue_WR_NF_NE_fst (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, + (u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra)) c_req true) as S; + apply S in NFULL as H; [ | trivial ]; clear S. apply H in Hadr as H'; clear H; rename H' into H. destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']]. autounfold with get_state. apply /andP; split. - 2: { - unfold tr; simpl in Mem; move: Mem => /andP [EqReq_r0 Mem]. - rewrite {2}/get_memcells_RequestQueue /get_mem_RequestQueue /get_memcells in Hrw. - apply (memcell_nch c wra rda c_req req_null) in Hadr as HH. - rewrite /req_null //= in HH. - rewrite VectorSpec.map_id /Bvect_false HH in EqReq_r0. - by rewrite /req_null //=. - } - apply /andP; split. - 2 : unfold EqCmd; by apply BVEq_iff_eq. + 2: unfold EqCmd; by apply BVEq_iff_eq. + apply /andP; split. 2 : { repeat lazymatch goal with @@ -1132,26 +1162,29 @@ Section CavaFIFOProperties. rewrite VectorSpec.map_id /Bvect_false HH in EqReq_r0. by rewrite /req_null //=. } + apply /andP; split. 2 : { rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'. simpl; rewrite eq_refl. - rewrite /Enqueue /R NF. + rewrite /Enqueue NF. simpl in HQ. - specialize (EqQueue_aux wra rda r0 r1 r) as HH. + specialize (EqQueue_aux wra rda r0 P arriving_req) as HH. apply HH in NFULL as HH'; clear HH; try done. move: HH'; simpl; intros HH. by move: HH => /andP [_ HH]. } + apply /andP; split. 2 : { rewrite /EqMem (surjective_pairing (step RequestQueue' _ _)) H Hrda' /Enqueue. - simpl; unfold R; rewrite NF //=. + simpl; rewrite NF //=. rewrite Hrw eq_refl. simpl in Mem; move: Mem => /andP [_ Mem]. apply EqMem_rcons; try done. simpl in HQ; by move: HQ => /andP [_ HQ]. } + apply /andP; split. 2 : { rewrite (surjective_pairing (step RequestQueue' _ _)) H //=. @@ -1160,34 +1193,25 @@ Section CavaFIFOProperties. end. rewrite VectorSpec.map_id; cbn [fst snd]. rewrite /Next_cycle_ref. - set Hc := c1.+1 < WAIT_REF; dependent destruction Hc; + set Hc := cref.+1 < PREA_date; dependent destruction Hc; apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro. { rewrite /cref2Bv //= Bv2N_N2Bv_sized. - 2: { - unfold COUNTER_REF_WIDTH; rewrite WAIT_REF_PW_N. - destruct c1; simpl; apply N_lt_inj; by apply /ltP. - } + 2: apply to_nat_lt_pow; rewrite Nat2N.id; apply cref_bound. rewrite /N2Bv_sized. - destruct (N.of_nat c1 + 1)%N eqn:Hbug; + destruct (N.of_nat cref + 1)%N eqn:Hbug; [ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ]. apply BVEq_iff_eq; f_equal; lia. } { apply cref_preadate_false in Href_prea as Href_prea_. - destruct c1; simpl in x,e,Hc0,Href_service_,Href_prea,Href_prea_. + destruct cref; simpl in x,e,Hc0,Href_service_,Href_prea,Href_prea_. rewrite /cref2Bv VectorSpec.map_id //= in Href_prea_. - apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]. - { assert (m = WAIT_REF.-1); [ lia | ]. + apply gtF_leq in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]. + { assert (m = PREA_date.-1); [ lia | ]. rewrite H0 addnC -ltn_subRL in Href_service_. - rewrite -subn1 ltn_subLR in Href_service_; [ | exact WAIT_REF_pos ]. + rewrite -subn1 ltn_subLR in Href_service_; [ | exact PREA_date_pos ]. contradict Href_service_; apply /negP. rewrite -leqNgt leq_eqVlt addnC. - specialize WAIT_REF_PREA_date as HH. - apply ltn_trans with (m := PREA_date - WAIT + 1) in HH; - [ by rewrite HH orb_true_r | ]. - rewrite -subnA. - { by rewrite ltn_subrL subn_gt0 WAIT_gt_one PREA_date_pos. } - { exact WAIT_pos. } - { by rewrite leq_eqVlt PREA_date_WAIT orb_true_r. } + apply /orP; right. lia. } { rewrite ltnS in x; contradict x; apply /negP; by rewrite -ltnNge. } } @@ -1206,72 +1230,84 @@ Section CavaFIFOProperties. | |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p) end; cbn [fst snd]. by []. Qed. + *) - Theorem SM_Eq_2a (t : nat) (c_state : State_t) c0 - (c1 : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) r : - (c1 + WAIT < PREA_date) = true -> - (nat_of_ord c1 == PREA_date - 1) = false -> + Theorem SM_Eq_2a (t : nat) (c_state : State_t) cnt + (cref : Counter_ref_t) (c_req : Bvector REQUEST_WIDTH) arriving_req : + (cref + WAIT < PREA_date) = true -> + (nat_of_ord cref == PREA_date - 1) = false -> let f_state := (Default_arbitrate t).(Implementation_State) in - let R := HW_Arrival_at t in - R == [:: r] -> EqReq r c_req -> State_Eq (IDLE c0 c1 []) c_state -> - let '(f_nextstate,(f_cmd_o,f_req_o)) := Next_state R (IDLE c0 c1 []) in - let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step FIFOSM_ c_state (true,c_req) in - (State_Eq f_nextstate c_nextstate) && - (EqCmd f_cmd_o c_cmd_o) && (EqReq f_req_o c_req_o). - Admitted. - (* Proof. - intros Href_service Href_prea f_state R NF EqR H; unfold FIFOSM_. - unfold R in NF; specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF. + let R := Arrival_at t in + R == [:: arriving_req] -> + EqReq (Some arriving_req) c_req -> + let S := IDLE cnt cref [] in + State_Eq S c_state -> + let '(f_nextstate,f_cmd_o) := Next_state R S in + let '(c_nextstate,(_,c_cmd_o,c_req_o)) := step CavaFIFOREF c_state (true,c_req) in + (State_Eq f_nextstate c_nextstate) && (EqCmd f_cmd_o c_cmd_o). + Proof. + + intros Href_service Href_prea f_state R NF EqR S H; unfold CavaFIFOREF. + unfold R in *; clear R. + specialize (HaltIfFull t c_state) as NFULL; move: NF => /eqP NF. unfold State_t in c_state; simpl in c_state; destruct_products. - rewrite NF //= in NFULL. - rename t0 into s, t1 into cnt, t2 into cref, t3 into cr, t4 into wra, t5 into rda. - rewrite /State_Eq /EqMem in H; autounfold with get_state in H; cbn [fst snd] in H. + rewrite NF //= in NFULL; cbv [get_wra get_rda get_fields] in NFULL. + rename t0 into s, t1 into cnt_, t2 into cref_, t3 into cr, t4 into wra, t5 into rda. + rewrite /State_Eq /EqMem in H; unfold S in H. + + (* What we know from State_Eq *) + autounfold with get_state in H; cbn [fst snd] in H. move: H => /andP [/andP [/andP [/andP [EqS EqCnt] EqCref] Mem] Hadr]. + + apply BVEq_iff_eq in EqS, EqCnt, EqCref; subst s cnt_ cref_. + unfold S in *; clear S. + + cbv [LoopInit]; cbn [step fst snd]; simpl_ret; cbv [and2]; cbn [fst snd]. + simpl in Hadr. + apply BVEq_iff_eq in Hadr. - apply BVEq_iff_eq in EqS, EqCnt, EqCref, Hadr; subst s cnt cref. - cbv [LoopInit]; cbn [step fst snd]; simpl_ret. - cbv [and2]. - assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv c1)) = true) as Haux; [ + assert ((Sidle STATE_IDLE_VEC && CrefPREA_lt (cref2Bv cref)) = true) as Haux; [ rewrite //= ; apply CrefPREA_lt_CNT_REF_WAIT; - [ by apply cref_preadate_false in Href_prea | done ] | ]; rewrite Haux; clear Haux. - cbn [snd]. + [ by apply cref_preadate_false in Href_prea | done ] | ]. rewrite Haux; clear Haux. rewrite (surjective_pairing (step RequestQueue' _ _)). - specialize (Queue_EMP_WR_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, + specialize (Queue_WR_E_snd ((u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, (u24, c, u23), u22, (u20, u21), (u14, (u16, (u18, u19, u17), u15)),u13, rda), wra))) c_req true) as S. cbv [get_addr_RequestQueue get_memcells_RequestQueue get_mem_RequestQueue get_memcells] in S. apply S in Hadr as H; clear S; destruct H as [full_o H]. rewrite H; clear H; cbn [fst snd]. set tr := nth_default req_null (N.to_nat (Bv2N rda)) _. - specialize NextCR_equiv with (c := (u7, (u8, cr))) (cnt := cnt2Bv c0) - (cref := cref2Bv c1) (tr := tr) as [cs_nextcr H]. - rewrite H; cbv [fst]; clear H. cbn [snd]. + specialize NextCR_equiv with (c := (u7, (u8, cr))) (cnt := cnt2Bv cnt) + (cref := cref2Bv cref) (tr := tr) as [cs_nextcr H]. + rewrite H; cbv [fst]; clear H; cbn [snd]. apply cref_preadate_false in Href_prea as Href_prea_. - apply (CmdGen_equiv_idle_to_idle_E u5 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H. + apply (CmdGen_equiv_idle_to_idle_E u5 (cnt2Bv cnt) (cref2Bv cref)) in Href_prea_ as H. destruct H as [cs_CmdGen H]; rewrite H; clear H; cbn [snd]. - apply (Update_equiv_idle_idle_E u3 (cnt2Bv c0) (cref2Bv c1)) in Href_prea_ as H. + apply (Update_equiv_idle_idle_E u3 (cnt2Bv cnt) (cref2Bv cref)) in Href_prea_ as H. destruct H as [cs_update H]; rewrite H; clear H; cbn [fst snd]. - cbv [get_rda get_wra get_fields] in NFULL. + cbn [constant]. + (* cbv [get_rda get_wra get_fields] in NFULL. *) rewrite /Next_state Href_prea Href_service /State_Eq. - specialize Queue_NF_EMP_WR_fst with (c := (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, - (u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra))) (c_req := c_req) as S. - apply S in NFULL as H; clear S. apply H in Hadr as H'; clear H; rename H' into H. + + specialize (Queue_WR_NF_E_fst (u11,(u12,(u26, (u27, (u29, (u31, u32, u30), u28)), u25, + (u24, c, u23), u22, (u20, u21),(u14, (u16, (u18, u19, u17), u15)), u13, rda), wra)) c_req true) as S. + apply S in NFULL as H; clear S; [ | trivial]; apply H in Hadr as H'; clear H; rename H' into H. destruct H as [cs_requeue' [Hx H]]; destruct Hx as [Hrw [Hwra' Hrda']]. autounfold with get_state. - apply /andP; split. - 2 : exact EqReqNil. apply /andP; split. 2 : unfold EqCmd; by apply BVEq_iff_eq. apply /andP; split. 2 : { - rewrite (surjective_pairing (step RequestQueue' _ _)) H Hwra' Hrda'. - simpl; rewrite Hadr; unfold R; rewrite NF //=. + rewrite (surjective_pairing (step RequestQueue' _ _)) H. + cbv [get_addr_RequestQueue] in Hwra'; rewrite Hwra'; clear Hwra'. + cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'. + simpl; rewrite Hadr; rewrite NF //=. apply /andP; split. { apply /negPf; apply (@N2Bv_sized_eq_p1_false ADDR_WIDTH rda); specialize ADDR_WIDTH_pos as Hpos; by move: Hpos => /ltP Hpos. } @@ -1279,8 +1315,9 @@ Section CavaFIFOProperties. } apply /andP; split. 2 : { - rewrite (surjective_pairing (step RequestQueue' _ _)) H Hrda'. - simpl; unfold R; rewrite NF //= /EqMem //= andb_true_r. + rewrite (surjective_pairing (step RequestQueue' _ _)) H. + cbv [get_addr_RequestQueue] in Hrda'; rewrite Hrda'; clear Hrda'. + simpl; rewrite NF //= /EqMem //= andb_true_r. rewrite Hrw; autounfold with get_state; rewrite Hadr VectorSpec.map_id. specialize (@nth_cells_read (Vec Bit REQUEST_WIDTH) ADDR_WIDTH InitMem rda c_req (Bvect_false REQUEST_WIDTH) c) as H'. @@ -1288,66 +1325,49 @@ Section CavaFIFOProperties. } apply /andP; split. 2 : { - rewrite (surjective_pairing (step RequestQueue' _ _)) H //=. + rewrite (surjective_pairing (step RequestQueue' _ _)) H; repeat lazymatch goal with | |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p) - end. - cbn [fst snd]. - rewrite /Next_cycle_ref. - set Hc := c1.+1 < WAIT_REF; dependent destruction Hc; + end; cbn [fst snd]. + rewrite //= /Next_cycle_ref. + set Hc := cref.+1 < PREA_date; dependent destruction Hc; apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro. { rewrite /cref2Bv //= Bv2N_N2Bv_sized. - 2: { - unfold COUNTER_REF_WIDTH; rewrite WAIT_REF_PW_N. - destruct c1; simpl; apply N_lt_inj; by apply /ltP. - } + 2: apply to_nat_lt_pow; rewrite Nat2N.id; apply cref_bound. rewrite /N2Bv_sized. - destruct (N.of_nat c1 + 1)%N eqn:Hbug; + destruct (N.of_nat cref + 1)%N eqn:Hbug; [ rewrite N.add_1_r in Hbug; contradict Hbug; apply N.neq_succ_0 | ]. apply BVEq_iff_eq; f_equal; lia. } - { destruct c1; simpl in x,e,Hc0,Href_prea,Href_prea_,Href_service. - rewrite /cref2Bv VectorSpec.map_id //= in Href_prea_. - apply ltn_gt in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]. - { assert (m = WAIT_REF.-1); [ lia | ]. - rewrite H0 addnC -ltn_subRL in Href_service. - rewrite -subn1 ltn_subLR in Href_service; [ | exact WAIT_REF_pos ]. - contradict Href_service; apply /negP. - rewrite -leqNgt leq_eqVlt addnC. - specialize WAIT_REF_PREA_date as HH. - apply ltn_trans with (m := PREA_date - WAIT + 1) in HH; - [ by rewrite HH orb_true_r | ]. - rewrite -subnA. - { by rewrite ltn_subrL subn_gt0 WAIT_gt_one PREA_date_pos. } - { exact WAIT_pos. } - { by rewrite leq_eqVlt PREA_date_WAIT orb_true_r. } - } - { rewrite ltnS in x; contradict x; apply /negP; by rewrite -ltnNge. } + { specialize (cref_bound cref) as Hc1_bound. + destruct cref; clear H Hrw Hwra' Hrda' cs_requeue' cs_nextcr; simpl in *. + apply gtF_leq in x; rewrite leq_eqVlt in x; move: x => /orP [/eqP x | x]; [ | lia]. + assert (m = PREA_date.-1); [ lia | ]. + rewrite H in Href_prea; contradict Href_prea; apply not_false_iff_true; by rewrite subn1 eq_refl. } } apply /andP; split. 2 : { - rewrite (surjective_pairing (step RequestQueue' _ _)) H //=. + rewrite (surjective_pairing (step RequestQueue' _ _)) H; repeat lazymatch goal with | |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p) - end. cbn [fst snd]. - rewrite /cnt2Bv; apply BVEq_iff_eq; f_equal. - apply Nat2N.inj_iff. + end; cbn [fst snd]. + rewrite /cnt2Bv //=; apply BVEq_iff_eq; f_equal; apply Nat2N.inj_iff. rewrite /Bv2cnt /Next_cycle //= Bv2N_N2Bv_sized //=. 2: { - destruct c0; rewrite //= /COUNTER_WIDTH. + destruct cnt; rewrite //= /COUNTER_WIDTH. rewrite WAIT_PW_2_N; apply N_lt_inj; by apply /ltP. } set (Hc := _ < WAIT); dependent destruction Hc; apply Logic.eq_sym in x; move : Logic.eq_refl; rewrite {2 3} x; simpl; intro; try rewrite Nat2N.id; try by rewrite Nat2N.id in x; move: Logic.eq_refl; rewrite {2 3}x; simpl; intro. } - rewrite (surjective_pairing (step RequestQueue' _ _)) H //=. + rewrite (surjective_pairing (step RequestQueue' _ _)) H; repeat lazymatch goal with | |- context [ match ?p with pair _ _ => _ end ] => rewrite (surjective_pairing p) - end; cbn [fst snd]. by []. - Qed. *) - + end; cbn [fst snd]. + by []. + Qed. (* Assuming a non-full regime, i.e., the front-end has yielded a valid request *) (* If R is non empty than the queue is not full *) diff --git a/framework/DRAM/Core/Commands.v b/framework/DRAM/Core/Commands.v index 9b390584608393656b0c62747dba88634ca8f22e..32d22667569ddf388898ba7bf2451e6537be7f6b 100644 --- a/framework/DRAM/Core/Commands.v +++ b/framework/DRAM/Core/Commands.v @@ -135,6 +135,12 @@ Section Commands. Definition isREF (cmd : Command_t) := (cmd.(CKind) == REF). + Definition isREF_cmdkind (cmd : Command_kind_t) := + match cmd with + | REF => true + | _ => false + end. + Definition ACT_of_req req t := mkCmd t (ACT req). Definition CAS_of_req req t := mkCmd t ((Kind_of_req req) req). diff --git a/framework/DRAM/Core/InterfaceSubLayer.v b/framework/DRAM/Core/InterfaceSubLayer.v index 80475d73bcd3ea53b832c7cb47e6305113cd4218..c1f1c6c503a61b589a6a19a048b33606c6fdd189 100644 --- a/framework/DRAM/Core/InterfaceSubLayer.v +++ b/framework/DRAM/Core/InterfaceSubLayer.v @@ -313,7 +313,6 @@ Section InterfaceSubLayer. rewrite /isNOP //= in Hnop; move: HH => /eqP HH; rewrite HH in Hnop; done. Qed. - Check IssueREF. Lemma command_matches_between_valid_states n IS_prev IS_cur cmd: cmd.(CDate) = n.+1 -> ~~ isNOP cmd -> cmd \in (Default_arbitrate n.+1).(Arbiter_Commands) -> diff --git a/framework/DRAM/Core/Trace.v b/framework/DRAM/Core/Trace.v index f2ccd080889d2476e4419eda7a9a1bfc9b78ffa7..547120ca86a11d9d1401612840bf32a04b37e33d 100644 --- a/framework/DRAM/Core/Trace.v +++ b/framework/DRAM/Core/Trace.v @@ -8,7 +8,6 @@ Section Trace. Context {SYS_CFG : System_configuration}. Context {REQESTOR_CFG : Requestor_configuration}. - (* Context {BK_MAP : BankMap}. *) Definition isACT_or_PRE cmd := (isACT cmd || isPRE cmd). @@ -129,8 +128,14 @@ Section Trace. Cmds_T_RFC_ok : forall a b, a \in Commands -> b \in Commands -> isREF a -> ~~ isNOP b -> Before a b -> Apart_at_least a b T_RFC; - Cmds_T_REFI_ok : forall a b, a \in Commands -> b \in Commands -> - isREF a -> isREF b -> Before a b -> b.(CDate) <= a.(CDate) + 9 * T_REFI; + Cmds_T_REFI_max_dist_ok : forall a, a \in Commands -> isREF a -> + exists b, b \in Commands /\ isREF b /\ b.(CDate) <= a.(CDate) + 9 * T_REFI; + + Cmds_T_REFI_density1_ok : forall t, + size ([seq cmd <- Commands | isREF cmd && (t <= cmd.(CDate)) && (cmd.(CDate) <= t + 2 * T_REFI)]) <= 16; + + Cmds_T_REFI_density2_ok : forall x, + (x+1) - 8 < size ([seq cmd <- Commands | isREF cmd && (cmd.(CDate) <= x * T_REFI)]); (* ------------------ Exclusively inter-bank constraints ------------------- *) Cmds_T_FAW_ok : forall a b c d, diff --git a/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve.v b/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve.v index eeafdf586529d74b7d4fd667b2693119a8eab7cd..d98c10780ff3d07e866ebc31b1b314d8d5361032 100644 --- a/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve.v +++ b/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve.v @@ -136,12 +136,17 @@ Section TDMShelve. (* The total number of non-critical requestors *) Definition NCreq := Treq - SN. + Inductive Grant_t := + | NoGrant : Grant_t + | SomeGrant : RequestorID_t -> Grant_t + | RefreshGrant : Grant_t. + Record TDMShelve_internal_state := mkTDMShelve_internal_state { (* Typical TDM slot and cycle counters *) Slot : Slot_t; Counter : TDMShelve_counter_t; (* Who has the grant to issue commands *) - Grant : option RequestorID_t; + Grant : Grant_t; (* Both critical and non-critical have associated deadlines *) Deadlines : { deadline_cnts : seq.seq nat | seq.size deadline_cnts == Treq}; (* A list used to track the arrival of requests *) @@ -150,6 +155,8 @@ Section TDMShelve. Slack : { slack_cnts : seq.seq nat | seq.size slack_cnts == SN }; }. + (* add another counter to count for cycles elapsed after REF has been issued ? *) + #[global] Instance SCH_ST : SchedulerInternalState := mkSIS TDMShelve_internal_state. (* Pick the first command from a given request *) @@ -158,8 +165,15 @@ Section TDMShelve. (req_id : RequestorID_t) : Command_kind_t := let f := filter (fun cmd => match cmd with - | CRD r | CRDA r | CWR r | CWRA r | ACT r | PRE r => - r.(Requestor).(ID) == req_id + | CRD r | CRDA r | CWR r | CWRA r | ACT r | PRE r => r.(Requestor).(ID) == req_id + | _ => false + end) map in seq.head NOP f. + + Definition Pick_refresh_cmd + (map : ReqCmdMap_t) : Command_kind_t := + let f := filter (fun cmd => + match cmd with + | PREA | REF => true | _ => false end) map in seq.head NOP f. @@ -168,8 +182,9 @@ Section TDMShelve. (SS : SystemState_t) (TDM_st : TDMShelve_internal_state) : Command_kind_t := match TDM_st.(Grant) with - | None => NOP - | Some requestor_id => Pick_cmd_from_requestorID map requestor_id + | NoGrant => NOP + | SomeGrant requestor_id => Pick_cmd_from_requestorID map requestor_id + | RefreshGrant => Pick_refresh_cmd map end. (* ------------------------------------------------------------------ *) @@ -228,25 +243,6 @@ Section TDMShelve. Definition checkIfPendingFromSlot (u_map : seq Command_kind_t) (s : Slot_t) := checkIfPendingFromID u_map (` (Slot_to_RequestorID s)). - (* let f := seq.find (fun cmd => - match cmd with - | CRD r | CRDA r | CWR r | CWRA r | ACT r | PRE r => - match r.(Requestor).(ReqSlot) with - | None => false - | Some s' => s' == s - end - | _ => false - end - ) unfiltered_cmd_map in ~~ (f == seq.size unfiltered_cmd_map). - *) - (* Wrong because have to look at the actual request and not the mapping *) - (* Definition filter_diff_bank (s : Slot_t) : seq RequestorID_t := - filter (fun req_id => - let s_id := Slot_to_RequestorID s in - let s_bank := Mapping s_id in - (` req_id == ` s_id) || (NoIntersection (Mapping req_id) s_bank) - ) All_requestors_sig. *) - (* Maybe just look at Arrivals to simplify things ?! *) Definition PendingReqs u_map (sub_list : seq RequestorID_t) : seq (option RequestorID_t) := seq.map (fun x => @@ -305,7 +301,7 @@ Section TDMShelve. exist (fun (s : seq bool) => seq.size s == Treq) (repeat false _) (repeat_size false Treq). Definition InitSchState (cmd_map : ReqCmdMap_t) := mkTDMShelve_internal_state - OZSlot OZCycle None InitialDeadlines InitialArrivals InitialSlack. + OZSlot OZCycle NoGrant InitialDeadlines InitialArrivals InitialSlack. (* ------------------------------------------------------------------ *) (* ----------- Defining update functions ---------------------------- *) @@ -337,7 +333,7 @@ Section TDMShelve. end ) None requestors. - Definition BankFiltering + Definition BankFiltering_ (u_map : ReqCmdMap_t) (TDM_st : TDMShelve_internal_state) : option RequestorID_t := let cnt := TDM_st.(Counter) in @@ -360,43 +356,75 @@ Section TDMShelve. ) else ( EDF TDM_st (filter_diff_bank_ u_map ns_slot) ) - end. - (* Decides who gets the grant grant *) - Definition UpdateGrant + Definition BankFiltering u_map TDM_st := + match BankFiltering_ u_map TDM_st with + | None => NoGrant + | Some req => SomeGrant req + end. + + Definition UpdateGrantRunning (u_map : ReqCmdMap_t) (sch_cmd : Command_kind_t) - (TDM_st : TDMShelve_internal_state) : option RequestorID_t := + (TDM_st : TDMShelve_internal_state) : Grant_t := let slt := TDM_st.(Slot) in let grant := TDM_st.(Grant) in let cur_slack := getSlackFromSlot TDM_st slt in let cnt := TDM_st.(Counter) in if (cnt == OZCycle) then ( (* Beginning of slot -> might abort requests *) match grant with - | None => if (u_map == [::]) then None else (BankFiltering u_map TDM_st) (* EDF (implement choice based on slack inside of EDF function) *) - | Some requestor_id => (* May be preempted or not *) + | NoGrant => if (u_map == [::]) then NoGrant else (BankFiltering u_map TDM_st) (* EDF (implement choice based on slack inside of EDF function) *) + | SomeGrant requestor_id => (* May be preempted or not *) match checkIfPendingFromSlot u_map slt with - | false => if (isCAS_cmdkind sch_cmd) then None else (BankFiltering u_map TDM_st) + | false => if (isCAS_cmdkind sch_cmd) then NoGrant else (BankFiltering u_map TDM_st) | true => let preq := Slot_to_RequestorID slt in let preq_deadl := getDeadlineFromID TDM_st (` preq) in if (preq_deadl <= SL) - then (Some preq) (* have to abort ! *) (* Rule 1 *) - else ( - if (isCAS_cmdkind sch_cmd) then None else (BankFiltering u_map TDM_st) - ) - (* BankFiltering u_map TDM_st) (Some requestor_id) *) + then (SomeGrant preq) (* have to abort ! *) (* Rule 1 *) + else (if (isCAS_cmdkind sch_cmd) then NoGrant else (BankFiltering u_map TDM_st)) end + | RefreshGrant => RefreshGrant (* should not happen *) end ) else ( (* Middle of the slot - EDF rules when a scheduling decision comes *) match grant with (* Rule 4 *) - | None => if (u_map == [::]) then None else (BankFiltering u_map TDM_st) - | Some requestor_id => - if (isCAS_cmdkind sch_cmd) then None else (Some requestor_id) + | NoGrant => if (u_map == [::]) then NoGrant else (BankFiltering u_map TDM_st) + | SomeGrant requestor_id => + if (isCAS_cmdkind sch_cmd) then NoGrant else (SomeGrant requestor_id) + | RefreshGrant => RefreshGrant (* should not happen *) end ). + (* to-do : account for t_RFC cycles ... *) + (* bank machine signal enter of refresh cycle and end *) + Definition UpdateGrantRefresh + (u_map : ReqCmdMap_t) + (sch_cmd : Command_kind_t) + (TDM_st : TDMShelve_internal_state) : Grant_t := + match TDM_st.(Grant) with + | NoGrant => NoGrant (* Should not happen *) + | SomeGrant r => SomeGrant r (* Should not happen *) + | RefreshGrant => if (isREF_cmdkind sch_cmd) then NoGrant else RefreshGrant + end. + + Definition checkIfREForPREA (unfiltered_cmd_map : seq Command_kind_t) : bool := + let f := seq.find (fun cmd => + match cmd with + | PREA | REF => true + | _ => false + end + ) unfiltered_cmd_map in ~~ (f == seq.size unfiltered_cmd_map). + + Definition UpdateGrant + (u_map : ReqCmdMap_t) + (sch_cmd : Command_kind_t) + (TDM_st : TDMShelve_internal_state) : Grant_t := + match TDM_st.(Grant) with + | NoGrant | SomeGrant _ => if (checkIfREForPREA u_map) then RefreshGrant else UpdateGrantRunning u_map sch_cmd TDM_st + | RefreshGrant => UpdateGrantRefresh u_map sch_cmd TDM_st + end. + Definition UpdateDeadlines sch_cmd u_map TDM_st := exist (fun s => seq.size s == Treq) (seq.map (fun requestor_id => (* Cycle counter *) @@ -458,13 +486,25 @@ Section TDMShelve. ) All_C_requestors) (size_map_iota _ _ _). Definition UpdatSchState sch_cmd cmd_map (SS : SystemState_t) TDM_st := - mkTDMShelve_internal_state - (Next_slot TDM_st.(Slot) TDM_st.(Counter)) - (Next_cycle TDM_st.(Counter)) - (UpdateGrant cmd_map sch_cmd TDM_st) - (UpdateDeadlines sch_cmd cmd_map TDM_st) - (UpdateArrivals sch_cmd cmd_map TDM_st) - (UpdateSlack sch_cmd TDM_st). + let next_grant := UpdateGrant cmd_map sch_cmd TDM_st in + match next_grant with + | NoGrant | SomeGrant _ => + mkTDMShelve_internal_state + (Next_slot TDM_st.(Slot) TDM_st.(Counter)) + (Next_cycle TDM_st.(Counter)) + (next_grant) + (UpdateDeadlines sch_cmd cmd_map TDM_st) + (UpdateArrivals sch_cmd cmd_map TDM_st) + (UpdateSlack sch_cmd TDM_st) + | RefreshGrant => + mkTDMShelve_internal_state + (TDM_st.(Slot)) + (TDM_st.(Counter)) + (next_grant) + (TDM_st.(Deadlines)) + (UpdateArrivals sch_cmd cmd_map TDM_st) + (TDM_st.(Slack)) + end. Lemma eqb_false_Some_inj {T : eqType} (a b : T) : (a == b) = false -> Some a <> Some b. @@ -480,26 +520,25 @@ Section TDMShelve. mkScheduler TDMShelve_schedule _ _ _ InitSchState UpdatSchState. Next Obligation. unfold TDMShelve_schedule. - destruct SCH_ST0.(Grant); [ | reflexivity]. - unfold Pick_cmd_from_requestorID; simpl; reflexivity. + destruct SCH_ST0.(Grant); reflexivity. Defined. Next Obligation. unfold TDMShelve_schedule; destruct SCH_ST0.(Grant); - [ | right; reflexivity ]. - unfold Pick_cmd_from_requestorID; simpl. + [ right; reflexivity | | ]; + unfold Pick_cmd_from_requestorID; simpl; destruct hd; simpl; try destruct (_ == r); simpl; try (by left; reflexivity); by right; reflexivity. Defined. Next Obligation. unfold TDMShelve_schedule; destruct SCH_ST0.(Grant); - [ | left; reflexivity ]. - unfold Pick_cmd_from_requestorID; + [ left; reflexivity | | ]. + all: unfold Pick_cmd_from_requestorID; induction m; simpl; [ left; reflexivity | ]; destruct IHm as [IHm | IHm]; destruct a; try destruct (_ == r); simpl; try (by left; assumption); - try (by right; rewrite in_cons eq_refl orTb). - all: by right; rewrite in_cons IHm orbT. + try (by right; rewrite in_cons eq_refl orTb); + by right; rewrite in_cons IHm orbT. Defined. (* The one defined in Interface SubLayer *) diff --git a/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve_sim.v b/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve_sim.v index cbf279cdc511cf9d4aad5173423cbd694e60269f..8f7b6bab80547c9a8772844fa4c39d6a8eaf7129 100644 --- a/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve_sim.v +++ b/framework/DRAM/Implementations/BM/TDMShelve/TDMShelve_sim.v @@ -215,10 +215,11 @@ Section TDMShelve_sim. Program Instance AF : Arrival_function_t := Default_arrival_function_t Input. - Definition computeGrant (g : option RequestorID_t) : option nat := + Definition computeGrant (g : Grant_t) : option nat := match g with - | None => None - | Some r => Some (proj1_sig r) + | NoGrant => None + | SomeGrant r => Some (proj1_sig r) + | RefreshGrant => None end. (* Ignore proofs for testing *) diff --git a/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v b/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v index b320c1a74071e333f68a5c908f342f979e5d8a68..8c1159c3c054b2702fb1ac9b028b69677f3321ca 100644 --- a/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v +++ b/framework/DRAM/Implementations/TS/FIFOREF/FIFOREF.v @@ -155,7 +155,7 @@ Section FIFOREF. | [::] => (IDLE c' cref' P', NOP) | r :: PP => (RUNNING OCycle0 cref' (Enqueue R (Dequeue r P)) r, (PRE r)) end - else (IDLE c' cref' P', NOP) + else (IDLE c' cref' P', NOP) (* Cases 3a/3b *) | RUNNING c cref P r => let P' := Enqueue R P in let c' := Next_cycle c in