X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fmatita%2Fcontribs%2Fng_assembly%2Fnum%2Fword16.ma;h=80281eeea6d64064dbfa4b208a4834adbd32b3c2;hb=ced2abc1e3fe84d5bbfa9ccb2ebf46f253279ebe;hp=6c1b21865168eb21c2619ea0ff2892657a3d31ee;hpb=417792b30223b5edd4a9194193c7f34514bd0fa3;p=helm.git diff --git a/helm/software/matita/contribs/ng_assembly/num/word16.ma b/helm/software/matita/contribs/ng_assembly/num/word16.ma index 6c1b21865..80281eeea 100755 --- a/helm/software/matita/contribs/ng_assembly/num/word16.ma +++ b/helm/software/matita/contribs/ng_assembly/num/word16.ma @@ -16,7 +16,7 @@ (* Progetto FreeScale *) (* *) (* Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it *) -(* Ultima modifica: 05/08/2009 *) +(* Sviluppo: 2008-2010 *) (* *) (* ********************************************************************** *) @@ -26,216 +26,127 @@ include "num/byte8.ma". (* WORD *) (* **** *) -nrecord word16 : Type ≝ - { - w16h: byte8; - w16l: byte8 - }. +ndefinition word16 ≝ comp_num byte8. +ndefinition mk_word16 ≝ λb1,b2.mk_comp_num byte8 b1 b2. +ndefinition ext_word16 ≝ λb2.mk_comp_num byte8 〈x0,x0〉 b2. +ndefinition ext2_word16 ≝ λe2.mk_comp_num byte8 〈x0,x0〉 〈x0,e2〉. (* \langle \rangle *) notation "〈x:y〉" non associative with precedence 80 - for @{ 'mk_word16 $x $y }. -interpretation "mk_word16" 'mk_word16 x y = (mk_word16 x y). + for @{ mk_comp_num byte8 $x $y }. + +(* iteratore sulle word *) +ndefinition forall_w16 ≝ forall_cn ? forall_b8. (* operatore = *) -ndefinition eq_w16 ≝ λw1,w2.(eq_b8 (w16h w1) (w16h w2)) ⊗ (eq_b8 (w16l w1) (w16l w2)). +ndefinition eq_w16 ≝ eq2_cn ? eq_b8. (* operatore < *) -ndefinition lt_w16 ≝ -λw1,w2:word16.match lt_b8 (w16h w1) (w16h w2) with - [ true ⇒ true - | false ⇒ match gt_b8 (w16h w1) (w16h w2) with - [ true ⇒ false - | false ⇒ lt_b8 (w16l w1) (w16l w2) ]]. +ndefinition lt_w16 ≝ ltgt_cn ? eq_b8 lt_b8. (* operatore ≤ *) -ndefinition le_w16 ≝ λw1,w2:word16.(eq_w16 w1 w2) ⊕ (lt_w16 w1 w2). +ndefinition le_w16 ≝ lege_cn ? eq_b8 lt_b8 le_b8. (* operatore > *) -ndefinition gt_w16 ≝ λw1,w2:word16.⊖ (le_w16 w1 w2). +ndefinition gt_w16 ≝ ltgt_cn ? eq_b8 gt_b8. (* operatore ≥ *) -ndefinition ge_w16 ≝ λw1,w2:word16.⊖ (lt_w16 w1 w2). +ndefinition ge_w16 ≝ lege_cn ? eq_b8 gt_b8 ge_b8. (* operatore and *) -ndefinition and_w16 ≝ -λw1,w2:word16.mk_word16 (and_b8 (w16h w1) (w16h w2)) (and_b8 (w16l w1) (w16l w2)). +ndefinition and_w16 ≝ fop2_cn ? and_b8. (* operatore or *) -ndefinition or_w16 ≝ -λw1,w2:word16.mk_word16 (or_b8 (w16h w1) (w16h w2)) (or_b8 (w16l w1) (w16l w2)). +ndefinition or_w16 ≝ fop2_cn ? or_b8. (* operatore xor *) -ndefinition xor_w16 ≝ -λw1,w2:word16.mk_word16 (xor_b8 (w16h w1) (w16h w2)) (xor_b8 (w16l w1) (w16l w2)). +ndefinition xor_w16 ≝ fop2_cn ? xor_b8. + +(* operatore Most Significant Bit *) +ndefinition getMSB_w16 ≝ getOPH_cn ? getMSB_b8. +ndefinition setMSB_w16 ≝ setOPH_cn ? setMSB_b8. +ndefinition clrMSB_w16 ≝ setOPH_cn ? clrMSB_b8. + +(* operatore Least Significant Bit *) +ndefinition getLSB_w16 ≝ getOPL_cn ? getLSB_b8. +ndefinition setLSB_w16 ≝ setOPL_cn ? setLSB_b8. +ndefinition clrLSB_w16 ≝ setOPL_cn ? clrLSB_b8. + +(* operatore estensione unsigned *) +ndefinition extu_w16 ≝ λb2.〈〈x0,x0〉:b2〉. +ndefinition extu2_w16 ≝ λe2.〈〈x0,x0〉:〈x0,e2〉〉. + +(* operatore estensione signed *) +ndefinition exts_w16 ≝ +λb2.〈(match getMSB_b8 b2 with + [ true ⇒ 〈xF,xF〉 | false ⇒ 〈x0,x0〉 ]):b2〉. +ndefinition exts2_w16 ≝ +λe2.(match getMSB_ex e2 with + [ true ⇒ 〈〈xF,xF〉:〈xF,e2〉〉 | false ⇒ 〈〈x0,x0〉:〈x0,e2〉〉 ]). (* operatore rotazione destra con carry *) -ndefinition rcr_w16 ≝ -λw:word16.λc:bool.match rcr_b8 (w16h w) c with - [ pair wh' c' ⇒ match rcr_b8 (w16l w) c' with - [ pair wl' c'' ⇒ pair … (mk_word16 wh' wl') c'' ]]. +ndefinition rcr_w16 ≝ opcr_cn ? rcr_b8. (* operatore shift destro *) -ndefinition shr_w16 ≝ -λw:word16.match rcr_b8 (w16h w) false with - [ pair wh' c' ⇒ match rcr_b8 (w16l w) c' with - [ pair wl' c'' ⇒ pair … (mk_word16 wh' wl') c'' ]]. +ndefinition shr_w16 ≝ opcr_cn ? rcr_b8 false. (* operatore rotazione destra *) ndefinition ror_w16 ≝ -λw:word16.match rcr_b8 (w16h w) false with - [ pair wh' c' ⇒ match rcr_b8 (w16l w) c' with - [ pair wl' c'' ⇒ match c'' with - [ true ⇒ mk_word16 (or_b8 (mk_byte8 x8 x0) wh') wl' - | false ⇒ mk_word16 wh' wl' ]]]. - -(* operatore rotazione destra n-volte *) -nlet rec ror_w16_n (w:word16) (n:nat) on n ≝ - match n with - [ O ⇒ w - | S n' ⇒ ror_w16_n (ror_w16 w) n' ]. +λw.match shr_w16 w with + [ pair c w' ⇒ match c with + [ true ⇒ setMSB_w16 w' | false ⇒ w' ]]. (* operatore rotazione sinistra con carry *) -ndefinition rcl_w16 ≝ -λw:word16.λc:bool.match rcl_b8 (w16l w) c with - [ pair wl' c' ⇒ match rcl_b8 (w16h w) c' with - [ pair wh' c'' ⇒ pair … (mk_word16 wh' wl') c'' ]]. +ndefinition rcl_w16 ≝ opcl_cn ? rcl_b8. (* operatore shift sinistro *) -ndefinition shl_w16 ≝ -λw:word16.match rcl_b8 (w16l w) false with - [ pair wl' c' ⇒ match rcl_b8 (w16h w) c' with - [ pair wh' c'' ⇒ pair … (mk_word16 wh' wl') c'' ]]. +ndefinition shl_w16 ≝ opcl_cn ? rcl_b8 false. (* operatore rotazione sinistra *) ndefinition rol_w16 ≝ -λw:word16.match rcl_b8 (w16l w) false with - [ pair wl' c' ⇒ match rcl_b8 (w16h w) c' with - [ pair wh' c'' ⇒ match c'' with - [ true ⇒ mk_word16 wh' (or_b8 (mk_byte8 x0 x1) wl') - | false ⇒ mk_word16 wh' wl' ]]]. - -(* operatore rotazione sinistra n-volte *) -nlet rec rol_w16_n (w:word16) (n:nat) on n ≝ - match n with - [ O ⇒ w - | S n' ⇒ rol_w16_n (rol_w16 w) n' ]. +λw.match shl_w16 w with + [ pair c w' ⇒ match c with + [ true ⇒ setLSB_w16 w' | false ⇒ w' ]]. (* operatore not/complemento a 1 *) -ndefinition not_w16 ≝ -λw:word16.mk_word16 (not_b8 (w16h w)) (not_b8 (w16l w)). +ndefinition not_w16 ≝ fop_cn ? not_b8. (* operatore somma con data+carry → data+carry *) -ndefinition plus_w16_dc_dc ≝ -λw1,w2:word16.λc:bool. - match plus_b8_dc_dc (w16l w1) (w16l w2) c with - [ pair l c ⇒ match plus_b8_dc_dc (w16h w1) (w16h w2) c with - [ pair h c' ⇒ pair … 〈h:l〉 c' ]]. +ndefinition plus_w16_dc_dc ≝ opcl2_cn ? plus_b8_dc_dc. (* operatore somma con data+carry → data *) -ndefinition plus_w16_dc_d ≝ -λw1,w2:word16.λc:bool. - match plus_b8_dc_dc (w16l w1) (w16l w2) c with - [ pair l c ⇒ 〈plus_b8_dc_d (w16h w1) (w16h w2) c:l〉 ]. +ndefinition plus_w16_dc_d ≝ λc,w1,w2.snd … (plus_w16_dc_dc c w1 w2). (* operatore somma con data+carry → c *) -ndefinition plus_w16_dc_c ≝ -λw1,w2:word16.λc:bool. - plus_b8_dc_c (w16h w1) (w16h w2) (plus_b8_dc_c (w16l w1) (w16l w2) c). +ndefinition plus_w16_dc_c ≝ λc,w1,w2.fst … (plus_w16_dc_dc c w1 w2). (* operatore somma con data → data+carry *) -ndefinition plus_w16_d_dc ≝ -λw1,w2:word16. - match plus_b8_d_dc (w16l w1) (w16l w2) with - [ pair l c ⇒ match plus_b8_dc_dc (w16h w1) (w16h w2) c with - [ pair h c' ⇒ pair … 〈h:l〉 c' ]]. +ndefinition plus_w16_d_dc ≝ opcl2_cn ? plus_b8_dc_dc false. (* operatore somma con data → data *) -ndefinition plus_w16_d_d ≝ -λw1,w2:word16. - match plus_b8_d_dc (w16l w1) (w16l w2) with - [ pair l c ⇒ 〈plus_b8_dc_d (w16h w1) (w16h w2) c:l〉 ]. +ndefinition plus_w16_d_d ≝ λw1,w2.snd … (plus_w16_d_dc w1 w2). (* operatore somma con data → c *) -ndefinition plus_w16_d_c ≝ -λw1,w2:word16. - plus_b8_dc_c (w16h w1) (w16h w2) (plus_b8_d_c (w16l w1) (w16l w2)). - -(* operatore Most Significant Bit *) -ndefinition MSB_w16 ≝ λw:word16.eq_ex x8 (and_ex x8 (b8h (w16h w))). +ndefinition plus_w16_d_c ≝ λw1,w2.fst … (plus_w16_d_dc w1 w2). (* operatore predecessore *) -ndefinition pred_w16 ≝ -λw:word16.match eq_b8 (w16l w) (mk_byte8 x0 x0) with - [ true ⇒ mk_word16 (pred_b8 (w16h w)) (pred_b8 (w16l w)) - | false ⇒ mk_word16 (w16h w) (pred_b8 (w16l w)) ]. +ndefinition pred_w16 ≝ predsucc_cn ? (eq_b8 〈x0,x0〉) pred_b8. (* operatore successore *) -ndefinition succ_w16 ≝ -λw:word16.match eq_b8 (w16l w) (mk_byte8 xF xF) with - [ true ⇒ mk_word16 (succ_b8 (w16h w)) (succ_b8 (w16l w)) - | false ⇒ mk_word16 (w16h w) (succ_b8 (w16l w)) ]. +ndefinition succ_w16 ≝ predsucc_cn ? (eq_b8 〈xF,xF〉) succ_b8. (* operatore neg/complemento a 2 *) ndefinition compl_w16 ≝ -λw:word16.match MSB_w16 w with +λw:word16.match getMSB_w16 w with [ true ⇒ succ_w16 (not_w16 w) | false ⇒ not_w16 (pred_w16 w) ]. -(* - operatore moltiplicazione senza segno: b*b=[0x0000,0xFE01] - ... in pratica (〈a,b〉*〈c,d〉) = (a*c)<<8+(a*d)<<4+(b*c)<<4+(b*d) -*) -ndefinition mul_b8 ≝ -λb1,b2:byte8.match b1 with -[ mk_byte8 b1h b1l ⇒ match b2 with -[ mk_byte8 b2h b2l ⇒ match mul_ex b1l b2l with -[ mk_byte8 t1_h t1_l ⇒ match mul_ex b1h b2l with -[ mk_byte8 t2_h t2_l ⇒ match mul_ex b2h b1l with -[ mk_byte8 t3_h t3_l ⇒ match mul_ex b1h b2h with -[ mk_byte8 t4_h t4_l ⇒ - plus_w16_d_d - (plus_w16_d_d - (plus_w16_d_d 〈〈x0,t3_h〉:〈t3_l,x0〉〉 〈〈x0,t2_h〉:〈t2_l,x0〉〉) 〈〈t4_h,t4_l〉:〈x0,x0〉〉)〈〈x0,x0〉:〈t1_h,t1_l〉〉 -]]]]]]. - -(* divisione senza segno (secondo la logica delle ALU): (quoziente resto) overflow *) -nlet rec div_b8_aux (divd:word16) (divs:word16) (molt:byte8) (q:byte8) (c:nat) on c ≝ - let w' ≝ plus_w16_d_d divd (compl_w16 divs) in - match c with - [ O ⇒ match le_w16 divs divd with - [ true ⇒ triple … (or_b8 molt q) (w16l w') (⊖ (eq_b8 (w16h w') 〈x0,x0〉)) - | false ⇒ triple … q (w16l divd) (⊖ (eq_b8 (w16h divd) 〈x0,x0〉)) ] - | S c' ⇒ match le_w16 divs divd with - [ true ⇒ div_b8_aux w' (ror_w16 divs) (ror_b8 molt) (or_b8 molt q) c' - | false ⇒ div_b8_aux divd (ror_w16 divs) (ror_b8 molt) q c' ]]. - -ndefinition div_b8 ≝ -λw:word16.λb:byte8.match eq_b8 b 〈x0,x0〉 with -(* - la combinazione n/0 e' illegale, segnala solo overflow senza dare risultato -*) - [ true ⇒ triple … 〈xF,xF〉 (w16l w) true - | false ⇒ match eq_w16 w 〈〈x0,x0〉:〈x0,x0〉〉 with -(* 0 diviso qualsiasi cosa diverso da 0 da' q=0 r=0 o=false *) - [ true ⇒ triple … 〈x0,x0〉 〈x0,x0〉 false -(* 1) e' una divisione sensata che produrra' overflow/risultato *) -(* 2) parametri: dividendo, divisore, moltiplicatore, quoziente, contatore *) -(* 3) ad ogni ciclo il divisore e il moltiplicatore vengono scalati di 1 a dx *) -(* 4) il moltiplicatore e' la quantita' aggiunta al quoziente se il divisore *) -(* puo' essere sottratto al dividendo *) - | false ⇒ div_b8_aux w (rol_w16_n 〈〈x0,x0〉:b〉 nat7) 〈x8,x0〉 〈x0,x0〉 nat7 ]]. - -(* operatore x in [inf,sup] *) +(* operatore x in [inf,sup] o in sup],[inf *) ndefinition inrange_w16 ≝ -λx,inf,sup:word16.(le_w16 inf sup) ⊗ (ge_w16 x inf) ⊗ (le_w16 x sup). - -(* iteratore sulle word *) -ndefinition forall_w16 ≝ - λP. - forall_b8 (λbh. - forall_b8 (λbl. - P (mk_word16 bh bl ))). +λx,inf,sup:word16. + match le_w16 inf sup with + [ true ⇒ and_bool | false ⇒ or_bool ] + (le_w16 inf x) (le_w16 x sup). (* word16 ricorsive *) ninductive rec_word16 : word16 → Type ≝ @@ -748,6 +659,6 @@ ndefinition w16_to_recw16_aux4 ≝ ndefinition w16_to_recw16 : Πw.rec_word16 w ≝ λw. - match w with [ mk_word16 h l ⇒ - match l with [ mk_byte8 lh ll ⇒ + match w with [ mk_comp_num h l ⇒ + match l with [ mk_comp_num lh ll ⇒ w16_to_recw16_aux4 h lh ll (w16_to_recw16_aux3 h lh (w16_to_recw16_aux2 h (b8_to_recb8 h))) ]].