module simple-data-types-ll {
  namespace "simple:data:types:ll";

  prefix "smpdtp";
  revision 2013-11-12 {
  }

  identity iden {
  }

  typedef tpdfempty {
    type empty;
  }

  typedef tpdfbit {
     type bits {
        bit b1;
        bit b2;
        bit b3;
    }
  }

  typedef tpdfun4 {
    type boolean;
  }

  typedef tpdfun3 {
    type union {
        type tpdfbit;
        type tpdfempty;
    }
  }

  typedef tpdfun2 {
    type union {
        type tpdfun3;
        type tpdfun4;
    }
  }

  typedef tpdfun1 {
    type union {
        type uint8;
        type decimal64 {
            fraction-digits 2;
        }
    }
  }

  container cont1 {
     leaf-list lfnint8Min {
        type int8;
      }
      leaf-list lfnint8Max {
        type int8;
      }
      leaf-list lfnint16Min {
        type int16;
      }
      leaf-list lfnint16Max {
        type int16;
      }
      leaf-list lfnint32Min {
        type int32;
      }
      leaf-list lfnint32Max {
        type int32;
      }
      leaf-list lfnint64Min {
        type int64;
      }
      leaf-list lfnint64Max {
        type int64;
      }
      leaf-list lfnuint8Max {
        type uint8;
      }
      leaf-list lfnuint16Max {
        type uint16;
      }
      leaf-list lfnuint32Max {
        type uint32;
      }
      leaf-list lfuint64Max {
        type uint64;
      }
      leaf-list lfstr {
        type string;
      }
      leaf-list lfstr1 {
        type string;
      }
      leaf-list lfbool1 {
        type boolean;
      }
      leaf-list lfbool2 {
        type boolean;
      }
      leaf-list lfbool3 {
        type boolean;
      }
      leaf-list lfdecimal1 {
        type decimal64 {
            fraction-digits 1;
        }
      }
      leaf-list lfdecimal2 {
        type decimal64 {
            fraction-digits 2;
        }
      }
      leaf-list lfdecimal3 {
        type decimal64 {
            fraction-digits 3;
        }
      }

      leaf-list lfdecimal4 {
        type decimal64 {
            fraction-digits 4;
        }
      }

      leaf-list lfdecimal6 {
        type decimal64 {
            fraction-digits 6;
        }
      }

    leaf-list lfenum {
      type enumeration {
        enum enum1;
        enum enum2;
        enum enum3;
        enum enum4;
      }
    }

    leaf-list lfbits {
      type bits {
        bit bit1;
        bit bit2;
        bit bit3;
        bit bit4;
      }
    }

    leaf-list lfbinary {
        type binary;
    }  

    leaf-list lfref1 {                  //reference to string type
        type leafref {
            path "../lfstr";
        }
    }

    leaf-list lfref2 {                  //reference to number type
        type leafref {
            path "../lfnint8Max";
        }
    }

    leaf-list lfempty {
        type empty;
    }

    leaf-list lfunion1 {
        type union {
            type uint16;
            type string;
        }
    }
    leaf-list lfunion2 {
        type union {
            type decimal64 {
                fraction-digits 2;
            }
            type string;
        }
    }

    leaf-list lfunion4 {
        type union {
            type boolean;
            type string;
        }
    }

    leaf-list lfunion5 {
        type union {
            type uint16;
            type string;
        }
    }

    leaf-list lfunion7 {
        type tpdfun3;
    }

    leaf-list lfunion8 {
        type union {
            type uint16;
            type string;
        }
    }

    leaf-list lfunion9 {
        type union {
            type uint16;
            type boolean;
        }
    }

    leaf-list lfunion10 {
        type union {
            type bits {
                bit bt1;
                bit bt2;
            }
            type boolean;
        }
    }

    leaf-list lfunion11 {
        type union {
            type tpdfun1;
            type tpdfun2;
        }
    }

    leaf-list lfunion12 {
        type tpdfun2;
    }

    leaf-list lfunion13 {
        type tpdfbit;    
    }

    leaf-list lfunion14 {
        type union {
            type enumeration {
                enum zero;
                enum one;
            }
            type uint16;
        }
    }

    leaf-list identityref1 {
        type identityref {
            base iden;
        }
    }

    leaf-list lfenum1 {
        type enumeration {
            enum "successful exit" {
                value 1;
            }
            enum "grace period expired" {
                value 2;
            }
        }
    }
    leaf-list lfenum2 {
        type enumeration {
            enum "successful exit" {
                value 1;
            }
            enum "*" {
                value 3;
            }
        }
    }
  }
}
