Library mcertikos.mm.MALTCSource

Require Import Coqlib.
Require Import AST.
Require Import Integers.
Require Import Values.
Require Import Cop.
Require Import Clight.
Require Import CDataTypes.
Require Import Ctypes.

Definition _id : ident := 1%positive.
Definition _p : ident := 2%positive.
Definition _i : ident := 3%positive.
Definition _mbi : ident := 4%positive.
Definition _n : ident := 5%positive.
Definition t_i : ident := 6%positive.
Definition t_u : ident := 7%positive.
Definition t_q : ident := 8%positive.
Definition t_nc : ident := 9%positive.
Definition t_child : ident := 10%positive.


        extern void mem_init(unsigned int);
        extern unsigned int get_nps(void);
        extern unsigned int is_norm(unsigned int);
        extern unsigned int at_get(unsigned int);

        void container_init(unsigned int mbi_addr)
        {
          unsigned int nps, real_quota, i, norm, used;

          mem_init(mbi_addr);

          nps = get_nps();
          real_quota = 0;
          i = 1;
          while (i < nps) {
            norm = is_norm(i);
            used = at_get(i);
            if (norm == 1 && used == 0)
              real_quota++;
            i++;
          }

          container_LOC[0].quota = real_quota;
          container_LOC[0].usage = 0;
          container_LOC[0].parent = 0;
          container_LOC[0].nchildren = 0;
          container_LOC[0].used = 1;
        }

Let t_nps: ident := 11%positive.
Let t_rq: ident := 12%positive.
Let t_norm: ident := 13%positive.
Let t_used: ident := 14%positive.

Definition container_init_while_condition : expr :=
  Ebinop Olt (Etempvar t_i tint) (Etempvar t_nps tint) tint.

Definition container_init_while_body : statement :=
   Ssequence
     (Scall
        (Some t_norm)
        (Evar is_norm (Tfunction (Tcons tint Tnil) tint cc_default))
        (Etempvar t_i tint :: nil))
     (Ssequence
        (Scall
           (Some t_used)
           (Evar at_get (Tfunction (Tcons tint Tnil) tint cc_default))
           (Etempvar t_i tint :: nil))
        (Ssequence
           (Sifthenelse
              (Ebinop Oand
                 (Ebinop Oeq (Etempvar t_norm tint) (Econst_int (Int.repr 1) tint) tint)
                 (Ebinop Oeq (Etempvar t_used tint) (Econst_int (Int.repr 0) tint) tint) tint)
              (Sset t_rq
                 (Ebinop Oadd (Etempvar t_rq tint)
                              (Econst_int (Int.repr 1) tint) tint))
              Sskip)
           (Sset t_i
              (Ebinop Oadd (Etempvar t_i tint)
                           (Econst_int (Int.repr 1) tint) tint)))).

Definition container_init_body :=
 Ssequence
  (Scall None (Evar mem_init (Tfunction (Tcons tint Tnil) tvoid cc_default))
    ((Etempvar _mbi tint) :: nil))
  (Ssequence
    (Scall (Some t_nps) (Evar get_nps (Tfunction Tnil tint cc_default)) nil)
    (Ssequence
       (Sset t_rq (Econst_int (Int.repr 0) tint))
       (Ssequence
          (Sset t_i (Econst_int (Int.repr 1) tint))
          (Ssequence
             (Swhile
                container_init_while_condition
                container_init_while_body)
             (Ssequence
                (Sassign
                   (Efield
                      (Ederef
                         (Ebinop Oadd
                                 (Evar AC_LOC (gvar_info container_loc_type))
                                 (Econst_int (Int.repr 0) tint)
                                 (tptr t_struct_AC)) t_struct_AC)
                      AC_quota tint) (Etempvar t_rq tint))
                (Ssequence
                   (Sassign
                      (Efield
                         (Ederef
                            (Ebinop Oadd
                                    (Evar AC_LOC (gvar_info container_loc_type))
                                    (Econst_int (Int.repr 0) tint)
                                    (tptr t_struct_AC)) t_struct_AC)
                         AC_usage tint) (Econst_int (Int.repr 0) tint))
                   (Ssequence
                      (Sassign
                         (Efield
                            (Ederef
                               (Ebinop Oadd
                                       (Evar AC_LOC (gvar_info container_loc_type))
                                       (Econst_int (Int.repr 0) tint)
                                       (tptr t_struct_AC)) t_struct_AC)
                            AC_parent tint) (Econst_int (Int.repr 0) tint))
                      (Ssequence
                         (Sassign
                            (Efield
                               (Ederef
                                  (Ebinop Oadd
                                          (Evar AC_LOC (gvar_info container_loc_type))
                                          (Econst_int (Int.repr 0) tint)
                                          (tptr t_struct_AC)) t_struct_AC)
                               AC_nchildren tint) (Econst_int (Int.repr 0) tint))
                         (Sassign
                            (Efield
                               (Ederef
                                  (Ebinop Oadd
                                          (Evar AC_LOC (gvar_info container_loc_type))
                                          (Econst_int (Int.repr 0) tint)
                                          (tptr t_struct_AC)) t_struct_AC)
                               AC_used tint) (Econst_int (Int.repr 1) tint)))))))))).

Definition f_container_init :=
  {|
    fn_return := tvoid;
    fn_callconv := cc_default;
    fn_params := (_mbi, tint) :: nil;
    fn_vars := nil;
    fn_temps := (t_nps, tint) :: (t_rq, tint) :: (t_i, tint) ::
                (t_norm, tint) :: (t_used, tint) ::nil;
    fn_body := container_init_body
  |}.

      unsigned int container_get_parent(unsigned int id)
      {
          return container_LOC[id].parent;
      }
Definition container_get_parent_body :=
  (Sreturn (Some (Efield
        (Ederef (Ebinop Oadd
                (Evar AC_LOC (gvar_info container_loc_type))
                (Etempvar _id tint) (tptr t_struct_AC))
                           t_struct_AC) AC_parent tint))).

Definition f_container_get_parent :=
  {|
    fn_return := tint;
    fn_callconv := cc_default;
    fn_params := ((_id, tint) :: nil);
    fn_vars := nil;
    fn_temps := nil;
    fn_body := container_get_parent_body
  |}.

      unsigned int container_get_nchildren(unsigned int id)
      {
          return container_LOC[id].nchildren;
      }
Definition container_get_nchildren_body :=
  (Sreturn (Some (Efield
        (Ederef (Ebinop Oadd
                (Evar AC_LOC (gvar_info container_loc_type))
                (Etempvar _id tint) (tptr t_struct_AC))
                           t_struct_AC) AC_nchildren tint))).

Definition f_container_get_nchildren :=
  {|
    fn_return := tint;
    fn_callconv := cc_default;
    fn_params := ((_id, tint) :: nil);
    fn_vars := nil;
    fn_temps := nil;
    fn_body := container_get_nchildren_body
  |}.

     unsigned int container_get_quota(unsigned int id)
     {
         return container_LOC[id].quota;
     }

Definition container_get_quota_body :=
  (Sreturn (Some (Efield
        (Ederef (Ebinop Oadd
                (Evar AC_LOC (gvar_info container_loc_type))
                (Etempvar _id tint) (tptr t_struct_AC))
                           t_struct_AC) AC_quota tint))).

Definition f_container_get_quota :=
  {|
    fn_return := tint;
    fn_callconv := cc_default;
    fn_params := ((_id, tint) :: nil);
    fn_vars := nil;
    fn_temps := nil;
    fn_body := container_get_quota_body
  |}.

      unsigned int container_get_usage(unsigned int id)
      {
          return container_LOC[id].usage;
      }
Definition container_get_usage_body :=
  (Sreturn (Some (Efield
        (Ederef (Ebinop Oadd
                (Evar AC_LOC (gvar_info container_loc_type))
                (Etempvar _id tint) (tptr t_struct_AC))
                           t_struct_AC) AC_usage tint))).

Definition f_container_get_usage :=
  {|
    fn_return := tint;
    fn_callconv := cc_default;
    fn_params := ((_id, tint) :: nil);
    fn_vars := nil;
    fn_temps := nil;
    fn_body := container_get_usage_body
  |}.

      unsigned int container_can_consume(unsigned int id, unsigned int n)
      {
          if (container_LOC[id].usage + n > container_LOC[id].quota) return 0;
          return 1;
      }

Definition container_can_consume_body :=
  (Ssequence
    (Sifthenelse (Ebinop Ole (Etempvar _n tint)
       (Efield (Ederef (Ebinop Oadd
                  (Evar AC_LOC (gvar_info container_loc_type))
                  (Etempvar _id tint) (tptr t_struct_AC))
                             t_struct_AC) AC_quota tint) tint)
    (Sifthenelse (Ebinop Ole
       (Efield (Ederef (Ebinop Oadd
                  (Evar AC_LOC (gvar_info container_loc_type))
                  (Etempvar _id tint) (tptr t_struct_AC))
                              t_struct_AC) AC_usage tint)
       (Ebinop Osub
          (Efield (Ederef (Ebinop Oadd
                      (Evar AC_LOC (gvar_info container_loc_type))
                      (Etempvar _id tint) (tptr t_struct_AC))
                                 t_struct_AC) AC_quota tint)
          (Etempvar _n tint) tint) tint)
      (Sreturn (Some (Econst_int (Int.repr 1) tint)))
      Sskip)
    Sskip)
  (Sreturn (Some (Econst_int (Int.repr 0) tint)))).

Definition f_container_can_consume :=
  {|
    fn_return := tint;
    fn_callconv := cc_default;
    fn_params := ((_id, tint) :: (_n, tint) :: nil);
    fn_vars := nil;
    fn_temps := nil;
    fn_body := container_can_consume_body
  |}.

         #define MAX_CHILDREN 3

         unsigned int container_split(unsigned int id, unsigned int quota)
         {
           unsigned int child, nc;

           nc = container_LOC[id].numChildren;
           child = id * MAX_CHILDREN + 1 + nc;

           container_LOC[child].used = 1;
           container_LOC[child].quota = quota;
           container_LOC[child].usage = 0;
           container_LOC[child].parent = id;
           container_LOC[child].nchildren = 0;

           container_LOC[id].usage += quota;
           container_LOC[id].nchildren = nc + 1;

           return child;
         }

Definition container_split_body :=
  (Ssequence
    (Sset t_nc
          (Efield
            (Ederef
              (Ebinop Oadd
                (Evar AC_LOC (gvar_info container_loc_type))
                (Etempvar _id tint) (tptr t_struct_AC))
              t_struct_AC) AC_nchildren tint))
    (Ssequence
      (Sset t_child
            (Ebinop Oadd
               (Ebinop Oadd
                  (Ebinop Omul
                     (Etempvar _id tint)
                     (Econst_int (Int.repr max_children) tint) tint)
                  (Econst_int (Int.repr 1) tint) tint)
               (Etempvar t_nc tint) tint))
      (Ssequence
        (Sassign
          (Efield
            (Ederef
              (Ebinop Oadd
                (Evar AC_LOC (gvar_info container_loc_type))
                (Etempvar t_child tint) (tptr t_struct_AC))
              t_struct_AC) AC_used tint)
          (Econst_int (Int.repr 1) tint))
        (Ssequence
          (Sassign
            (Efield
              (Ederef
                (Ebinop Oadd
                  (Evar AC_LOC (gvar_info container_loc_type))
                  (Etempvar t_child tint) (tptr t_struct_AC))
                t_struct_AC) AC_quota tint)
            (Etempvar _n tint))
          (Ssequence
            (Sassign
              (Efield
                (Ederef
                  (Ebinop Oadd
                    (Evar AC_LOC (gvar_info container_loc_type))
                    (Etempvar t_child tint) (tptr t_struct_AC))
                  t_struct_AC) AC_usage tint)
              (Econst_int (Int.repr 0) tint))
            (Ssequence
              (Sassign
                (Efield
                  (Ederef
                    (Ebinop Oadd
                      (Evar AC_LOC (gvar_info container_loc_type))
                      (Etempvar t_child tint) (tptr t_struct_AC))
                    t_struct_AC) AC_parent tint)
                (Etempvar _id tint))
              (Ssequence
                (Sassign
                  (Efield
                    (Ederef
                      (Ebinop Oadd
                        (Evar AC_LOC (gvar_info container_loc_type))
                        (Etempvar t_child tint)
                        (tptr t_struct_AC))
                      t_struct_AC) AC_nchildren tint)
                  (Econst_int (Int.repr 0) tint))
                (Ssequence
                  (Sassign
                    (Efield
                      (Ederef
                        (Ebinop Oadd
                          (Evar AC_LOC (gvar_info container_loc_type))
                          (Etempvar _id tint)
                          (tptr t_struct_AC))
                        t_struct_AC) AC_usage tint)
                    (Ebinop Oadd
                      (Efield
                        (Ederef
                          (Ebinop Oadd
                            (Evar AC_LOC (gvar_info container_loc_type))
                            (Etempvar _id tint)
                            (tptr t_struct_AC))
                          t_struct_AC) AC_usage tint)
                      (Etempvar _n tint) tint))
                  (Ssequence
                    (Sassign
                      (Efield
                        (Ederef
                          (Ebinop Oadd
                            (Evar AC_LOC (gvar_info container_loc_type))
                            (Etempvar _id tint)
                            (tptr t_struct_AC))
                          t_struct_AC) AC_nchildren tint)
                      (Ebinop Oadd
                        (Etempvar t_nc tint)
                        (Econst_int (Int.repr 1) tint) tint))
                    (Sreturn (Some (Etempvar t_child tint)))))))))))).

Definition f_container_split :=
  {|
    fn_return := tint;
    fn_callconv := cc_default;
    fn_params := ((_id, tint) :: (_n, tint) :: nil);
    fn_vars := nil;
    fn_temps := (t_child, tint) :: (t_nc, tint) :: nil;
    fn_body := container_split_body
  |}.

      extern unsigned int palloc(void);

      unsigned int container_alloc(unsigned int id)
      {
          unsigned int u, q, i;
          u = container_LOC[id].usage;
          q = container_LOC[id].quota;
          if (u == q) return 0;

          container_LOC[id].usage = u+1;
          i = palloc();
          return i;
      }

Definition container_alloc_body :=
  Ssequence
  (Sset t_u
    (Efield
      (Ederef
        (Ebinop Oadd
          (Evar AC_LOC (gvar_info container_loc_type))
          (Etempvar _id tint) (tptr t_struct_AC))
        t_struct_AC) AC_usage tint))
  (Ssequence
    (Sset t_q
      (Efield
        (Ederef
          (Ebinop Oadd
            (Evar AC_LOC (gvar_info container_loc_type))
            (Etempvar _id tint) (tptr t_struct_AC))
          t_struct_AC) AC_quota tint))
    (Ssequence
      (Sifthenelse (Ebinop Oeq (Etempvar t_u tint) (Etempvar t_q tint) tint)
        (Sreturn (Some (Econst_int (Int.repr 0) tint)))
        Sskip)
      (Ssequence
        (Sassign
          (Efield
            (Ederef
              (Ebinop Oadd
                (Evar AC_LOC (gvar_info container_loc_type))
                (Etempvar _id tint) (tptr t_struct_AC))
              t_struct_AC) AC_usage tint)
          (Ebinop Oadd (Etempvar t_u tint) (Econst_int (Int.repr 1) tint)
            tint))
        (Ssequence
           (Scall
              (Some t_i)
              (Evar palloc (Tfunction Tnil tint cc_default))
              nil)
           (Sreturn (Some (Etempvar t_i tint))))))).

Definition f_container_alloc :=
  {|
    fn_return := tint;
    fn_callconv := cc_default;
    fn_params := ((_id, tint) :: nil);
    fn_vars := nil;
    fn_temps := ((t_u, tint) :: (t_q, tint) :: (t_i, tint) :: nil);
    fn_body := container_alloc_body
  |}.