mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 00:47:26 +00:00
scripts/dtc: Add support for floating-point literals
Signed-off-by: Asahi Lina <lina@asahilina.net>
This commit is contained in:
parent
0346b3f48c
commit
cee66705cc
4 changed files with 66 additions and 0 deletions
|
@ -197,6 +197,33 @@ struct data data_append_integer(struct data d, uint64_t value, int bits)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct data data_append_float(struct data d, double value, int bits)
|
||||||
|
{
|
||||||
|
float f32;
|
||||||
|
uint32_t u32;
|
||||||
|
double f64;
|
||||||
|
uint64_t u64;
|
||||||
|
fdt32_t value_32;
|
||||||
|
fdt64_t value_64;
|
||||||
|
|
||||||
|
switch (bits) {
|
||||||
|
case 32:
|
||||||
|
f32 = value;
|
||||||
|
memcpy(&u32, &f32, sizeof(u32));
|
||||||
|
value_32 = cpu_to_fdt32(u32);
|
||||||
|
return data_append_data(d, &value_32, 4);
|
||||||
|
|
||||||
|
case 64:
|
||||||
|
f64 = value;
|
||||||
|
memcpy(&u64, &f64, sizeof(u64));
|
||||||
|
value_64 = cpu_to_fdt64(u64);
|
||||||
|
return data_append_data(d, &value_64, 8);
|
||||||
|
|
||||||
|
default:
|
||||||
|
die("Invalid literal size (%d)\n", bits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct data data_append_re(struct data d, uint64_t address, uint64_t size)
|
struct data data_append_re(struct data d, uint64_t address, uint64_t size)
|
||||||
{
|
{
|
||||||
struct fdt_reserve_entry re;
|
struct fdt_reserve_entry re;
|
||||||
|
|
|
@ -166,6 +166,28 @@ static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
|
||||||
return DT_LABEL;
|
return DT_LABEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<V1>[-+]?(([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))(e[-+]?[0-9]+)?f? {
|
||||||
|
char *e;
|
||||||
|
DPRINT("Floating-point Literal: '%s'\n", yytext);
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
yylval.floating = strtod(yytext, &e);
|
||||||
|
|
||||||
|
if (*e && (*e != 'f' || e[1])) {
|
||||||
|
lexical_error("Bad floating-point literal '%s'",
|
||||||
|
yytext);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errno == ERANGE)
|
||||||
|
lexical_error("Floating-point literal '%s' out of range",
|
||||||
|
yytext);
|
||||||
|
else
|
||||||
|
/* ERANGE is the only strtod error triggerable
|
||||||
|
* by strings matching the pattern */
|
||||||
|
assert(errno == 0);
|
||||||
|
return DT_FP_LITERAL;
|
||||||
|
}
|
||||||
|
|
||||||
<V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
|
<V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
|
||||||
char *e;
|
char *e;
|
||||||
DPRINT("Integer Literal: '%s'\n", yytext);
|
DPRINT("Integer Literal: '%s'\n", yytext);
|
||||||
|
|
|
@ -53,6 +53,7 @@ extern bool treesource_error;
|
||||||
struct node *nodelist;
|
struct node *nodelist;
|
||||||
struct reserve_info *re;
|
struct reserve_info *re;
|
||||||
uint64_t integer;
|
uint64_t integer;
|
||||||
|
double floating;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,6 +67,7 @@ extern bool treesource_error;
|
||||||
%token DT_OMIT_NO_REF
|
%token DT_OMIT_NO_REF
|
||||||
%token <propnodename> DT_PROPNODENAME
|
%token <propnodename> DT_PROPNODENAME
|
||||||
%token <integer> DT_LITERAL
|
%token <integer> DT_LITERAL
|
||||||
|
%token <floating> DT_FP_LITERAL
|
||||||
%token <integer> DT_CHAR_LITERAL
|
%token <integer> DT_CHAR_LITERAL
|
||||||
%token <byte> DT_BYTE
|
%token <byte> DT_BYTE
|
||||||
%token <data> DT_STRING
|
%token <data> DT_STRING
|
||||||
|
@ -89,6 +91,7 @@ extern bool treesource_error;
|
||||||
%type <node> subnode
|
%type <node> subnode
|
||||||
%type <nodelist> subnodes
|
%type <nodelist> subnodes
|
||||||
|
|
||||||
|
%type <floating> floating_prim
|
||||||
%type <integer> integer_prim
|
%type <integer> integer_prim
|
||||||
%type <integer> integer_unary
|
%type <integer> integer_unary
|
||||||
%type <integer> integer_mul
|
%type <integer> integer_mul
|
||||||
|
@ -358,6 +361,15 @@ arrayprefix:
|
||||||
$$.data = empty_data;
|
$$.data = empty_data;
|
||||||
$$.bits = 32;
|
$$.bits = 32;
|
||||||
}
|
}
|
||||||
|
| arrayprefix floating_prim
|
||||||
|
{
|
||||||
|
if ($1.bits < 32) {
|
||||||
|
ERROR(&@2, "Floating-point values must be"
|
||||||
|
" 32-bit or 64-bit");
|
||||||
|
}
|
||||||
|
|
||||||
|
$$.data = data_append_float($1.data, $2, $1.bits);
|
||||||
|
}
|
||||||
| arrayprefix integer_prim
|
| arrayprefix integer_prim
|
||||||
{
|
{
|
||||||
if ($1.bits < 64) {
|
if ($1.bits < 64) {
|
||||||
|
@ -397,6 +409,10 @@ arrayprefix:
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
floating_prim:
|
||||||
|
DT_FP_LITERAL
|
||||||
|
;
|
||||||
|
|
||||||
integer_prim:
|
integer_prim:
|
||||||
DT_LITERAL
|
DT_LITERAL
|
||||||
| DT_CHAR_LITERAL
|
| DT_CHAR_LITERAL
|
||||||
|
|
|
@ -115,6 +115,7 @@ struct data data_insert_at_marker(struct data d, struct marker *m,
|
||||||
struct data data_merge(struct data d1, struct data d2);
|
struct data data_merge(struct data d1, struct data d2);
|
||||||
struct data data_append_cell(struct data d, cell_t word);
|
struct data data_append_cell(struct data d, cell_t word);
|
||||||
struct data data_append_integer(struct data d, uint64_t word, int bits);
|
struct data data_append_integer(struct data d, uint64_t word, int bits);
|
||||||
|
struct data data_append_float(struct data d, double value, int bits);
|
||||||
struct data data_append_re(struct data d, uint64_t address, uint64_t size);
|
struct data data_append_re(struct data d, uint64_t address, uint64_t size);
|
||||||
struct data data_append_addr(struct data d, uint64_t addr);
|
struct data data_append_addr(struct data d, uint64_t addr);
|
||||||
struct data data_append_byte(struct data d, uint8_t byte);
|
struct data data_append_byte(struct data d, uint8_t byte);
|
||||||
|
|
Loading…
Reference in a new issue