diff options
Diffstat (limited to 'tools/d2c/assert')
| -rw-r--r-- | tools/d2c/assert/manager.c | 123 | ||||
| -rw-r--r-- | tools/d2c/assert/tokens.l | 2 | 
2 files changed, 122 insertions, 3 deletions
| diff --git a/tools/d2c/assert/manager.c b/tools/d2c/assert/manager.c index 2ccf468..4fe1860 100644 --- a/tools/d2c/assert/manager.c +++ b/tools/d2c/assert/manager.c @@ -63,6 +63,13 @@ struct _disass_assert  }; +/* Définit le masque correspondant à une valeur booléenne. */ +static char *get_disass_assert_mask(const char *); + +/* Définit la valeur correspondant à une valeur booléenne. */ +static char *get_disass_assert_value(const char *); + +  /******************************************************************************  *                                                                             * @@ -301,6 +308,8 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit      size_t j;                               /* Boucle de parcours #2       */      def_cond *cond;                         /* Condition à marquer         */      raw_bitfield *rf;                       /* Champ de bits à marquer     */ +    char *mask;                             /* Eventuel masque à appliquer */ +    char *expected;                         /* Valeur attendue             */      for (i = 0; i < dassert->count; i++)      { @@ -337,7 +346,22 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit                  } -            write_raw_bitfield(rf, fd); +            mask = get_disass_assert_mask(cond->value); + +            if (mask == NULL) +                write_raw_bitfield(rf, fd); + +            else +            { +                dprintf(fd, "("); + +                write_raw_bitfield(rf, fd); + +                dprintf(fd, " & %s)", mask); + +                free(mask); + +            }              switch (cond->op)              { @@ -351,7 +375,11 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit              } -            dprintf(fd, "b%s", cond->value); +            expected = get_disass_assert_value(cond->value); + +            dprintf(fd, "%s", expected); + +            free(expected);          } @@ -363,3 +391,94 @@ bool define_disass_assert(const disass_assert *dassert, int fd, const coding_bit      return true;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : value = valeur booléenne à écrire.                           * +*                                                                             * +*  Description : Définit le masque correspondant à une valeur booléenne.      * +*                                                                             * +*  Retour      : Masque à appliquer (et libérer) ou NULL si aucun.            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static char *get_disass_assert_mask(const char *value) +{ +    char *result;                           /* Masque à renvoyer           */ +    char *iter;                             /* Boucle de parcours          */ + +    if (strchr(value, 'x') == NULL) +        result = NULL; + +    else +    { +        result = strdup(value); + +        for (iter = result; *iter != '\0'; iter++) +            switch (*iter) +            { +                case '0': +                case '1': +                    *iter = '1'; +                    break; + +                case 'x': +                    *iter = '0'; +                    break; + +                default: +                    assert(false); +                    break; + +            } + +    } + +    return result; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : value = valeur booléenne à écrire.                           * +*                                                                             * +*  Description : Définit la valeur correspondant à une valeur booléenne.      * +*                                                                             * +*  Retour      : Valeur à comparer et libérer.                                * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static char *get_disass_assert_value(const char *value) +{ +    char *result;                           /* Masque à renvoyer           */ +    char *iter;                             /* Boucle de parcours          */ + +    result = strdup(value); + +    if (strchr(value, 'x') != NULL) +        for (iter = result; *iter != '\0'; iter++) +            switch (*iter) +            { +                case '0': +                case '1': +                    break; + +                case 'x': +                    *iter = '0'; +                    break; + +                default: +                    assert(false); +                    break; + +            } + +    return result; + +} diff --git a/tools/d2c/assert/tokens.l b/tools/d2c/assert/tokens.l index 192bcc7..e455a76 100644 --- a/tools/d2c/assert/tokens.l +++ b/tools/d2c/assert/tokens.l @@ -29,7 +29,7 @@  [A-Za-z_][A-Za-z0-9_]*  { yylvalp->string = strdup(yytext); return FIELD; } -[01]+                   { yylvalp->string = strdup(yytext); return VALUE; } +[01x]+                  { yylvalp->string = strdup(yytext); return VALUE; }  .                       {                              char *msg; | 
