57 lines
1.1 KiB
Typst
57 lines
1.1 KiB
Typst
#import "range.typ" as rng
|
|
#import "util.typ"
|
|
|
|
#let make(
|
|
name,
|
|
bits,
|
|
ranges,
|
|
start: 0
|
|
) = {
|
|
return (
|
|
name: name,
|
|
bits: bits,
|
|
ranges: ranges,
|
|
start: start
|
|
)
|
|
}
|
|
|
|
#let load(id, data) = {
|
|
let struct = (id: id)
|
|
let ranges = (:)
|
|
|
|
for (range-span, range-data) in data.ranges {
|
|
let (start, end) = rng.parse-span(str(range-span))
|
|
ranges.insert(
|
|
rng.key(start, end),
|
|
rng.load(start, end, range-data)
|
|
)
|
|
}
|
|
|
|
let ranges2 = (:)
|
|
for (k, range_) in ranges {
|
|
if range_.values != none and range_.depends-on != none {
|
|
let depends-key = rng.key(..range_.depends-on)
|
|
let depends-range = ranges.at(depends-key)
|
|
let bits = rng.bits(depends-range)
|
|
let values = (:)
|
|
for (v, d) in range_.values {
|
|
v = util.z-fill(str(int(v)), bits)
|
|
values.insert(v, d)
|
|
}
|
|
range_.values = values
|
|
}
|
|
ranges2.insert(k, range_)
|
|
}
|
|
|
|
return make(
|
|
id,
|
|
int(data.bits),
|
|
ranges2,
|
|
start: data.at("start", default: 0)
|
|
)
|
|
}
|
|
|
|
#let get-sorted-ranges(struct) = {
|
|
let ranges = struct.ranges.values()
|
|
return ranges.sorted(key: r => r.end)
|
|
} |