Removed revision count from lfsr_rbyd_t

Now we read the revision count on-demand, trading off some extra reads
for a smaller lfsr_rbyd_t struct.

I believe this is worth it because:

1. We're created a lot of lfsr_rbyd_t structs as a part of the relatively
   complicated mdir/btree commit logic in order to safely fallback on errors.

2. We don't really need the revision count for our Cow btrees, so we
   only need to read the revision count on mdir fetch (which we were
   already reading too many times), on mdir compact, and on rbyd fetch
   as a part of checksum calculation.

   This really only adds a O(1) cost when we are compacting, which is rather
   small.

Current measurements:

  code:  8980 -> 9036 (+0.6%)
  stack: 1024 -> 1000 (-2.3%)

Though note this is currently without any mdir/btree commit code being
dragged in.
This commit is contained in:
Christopher Haster
2023-06-19 17:01:56 -05:00
parent 98ef342942
commit 0690a86f1d
3 changed files with 92 additions and 139 deletions
+92 -44
View File
@@ -1585,8 +1585,8 @@ static bool lfsr_rbyd_isfetched(const lfsr_rbyd_t *rbyd) {
// allocate an rbyd block
static int lfsr_rbyd_alloc(lfs_t *lfs, lfsr_rbyd_t *rbyd, uint32_t rev) {
*rbyd = (lfsr_rbyd_t){.rev=rev, .weight=0, .trunk=0, .off=0, .crc=0};
static int lfsr_rbyd_alloc(lfs_t *lfs, lfsr_rbyd_t *rbyd) {
*rbyd = (lfsr_rbyd_t){.weight=0, .trunk=0, .off=0, .crc=0};
int err = lfs_alloc(lfs, &rbyd->block);
if (err) {
return err;
@@ -1602,20 +1602,16 @@ static int lfsr_rbyd_alloc(lfs_t *lfs, lfsr_rbyd_t *rbyd, uint32_t rev) {
static int lfsr_rbyd_fetch(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfs_block_t block, lfs_size_t trunk) {
// read the revision count and get the crc started
uint32_t rev;
// checksum the revision count to get the crc started
uint32_t crc = 0;
int err = lfsr_bd_readcsum(lfs, block, 0, lfs->cfg->block_size,
&rev, sizeof(uint32_t),
&crc);
int err = lfsr_bd_csum(lfs, block, 0, lfs->cfg->block_size,
sizeof(uint32_t), &crc);
if (err) {
return err;
}
rev = lfs_fromle32_(&rev);
rbyd->block = block;
rbyd->off = 0;
rbyd->rev = rev;
// temporary state until we validate a crc
lfs_off_t off = sizeof(uint32_t);
@@ -1904,6 +1900,33 @@ static lfs_ssize_t lfsr_rbyd_get(lfs_t *lfs, const lfsr_rbyd_t *rbyd,
}
// append a revision count
//
// this is optional, if not called revision count defaults to 0 (for btrees)
static int lfsr_rbyd_appendrev(lfs_t *lfs, lfsr_rbyd_t *rbyd, uint32_t rev) {
// should only be called before any tags are written
LFS_ASSERT(rbyd->off == 0);
// revision count stored as le32, we don't use a leb128 encoding as we
// intentionally allow the revision count to overflow
uint8_t buf[sizeof(uint32_t)];
lfs_tole32_(rev, &buf);
int err = lfsr_bd_prog(lfs, rbyd->block, rbyd->off,
&buf, sizeof(uint32_t), &rbyd->crc);
if (err) {
goto failed;
}
rbyd->off += sizeof(uint32_t);
return 0;
failed:
// if we fail mark the rbyd as unerased and release the pcache
lfs_cache_zero(lfs, &lfs->pcache);
rbyd->off = lfs->cfg->block_size;
return err;
}
// helper functions for managing the 3-element fifo used in lfsr_rbyd_append
static int lfsr_rbyd_p_flush(lfs_t *lfs, lfsr_rbyd_t *rbyd,
lfsr_tag_t p_alts[static 3],
@@ -2033,16 +2056,12 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd,
return 0;
}
// make sure every rbyd starts with its revision count
// make sure every rbyd starts with a revision count
if (rbyd->off == 0) {
uint8_t buf[sizeof(uint32_t)];
lfs_tole32_(rbyd->rev, &buf);
err = lfsr_bd_prog(lfs, rbyd->block, rbyd->off,
&buf, sizeof(uint32_t), &rbyd->crc);
err = lfsr_rbyd_appendrev(lfs, rbyd, 0);
if (err) {
goto failed;
}
rbyd->off += sizeof(uint32_t);
}
// figure out the range of tags we're operating on
@@ -2593,19 +2612,16 @@ static int lfsr_rbyd_commit(lfs_t *lfs, lfsr_rbyd_t *rbyd,
goto failed;
}
// setup commit state
// setup commit state, use a separate rbyd so we have a fallback in
// case of error
lfsr_rbyd_t rbyd_ = *rbyd;
// make sure every rbyd starts with its revision count
if (rbyd_.off == 0) {
uint8_t buf[sizeof(uint32_t)];
lfs_tole32_(rbyd_.rev, &buf);
err = lfsr_bd_prog(lfs, rbyd_.block, rbyd_.off,
&buf, sizeof(uint32_t), &rbyd_.crc);
err = lfsr_rbyd_appendrev(lfs, &rbyd_, 0);
if (err) {
goto failed;
}
rbyd_.off += sizeof(uint32_t);
}
// append each tag to the tree
@@ -3598,9 +3614,8 @@ static int lfsr_btree_commit(lfs_t *lfs,
goto split;
}
// TODO were we doing something funky with rev?
// allocate a new rbyd
err = lfsr_rbyd_alloc(lfs, &rbyd_, rbyd->rev+1);
err = lfsr_rbyd_alloc(lfs, &rbyd_);
if (err) {
return err;
}
@@ -3692,16 +3707,15 @@ static int lfsr_btree_commit(lfs_t *lfs,
return split_id;
}
// TODO were we doing something funky with rev?
// allocate a new rbyd
err = lfsr_rbyd_alloc(lfs, &rbyd_, rbyd->rev+1);
err = lfsr_rbyd_alloc(lfs, &rbyd_);
if (err) {
return err;
}
// allocate a sibling
lfsr_rbyd_t sibling;
err = lfsr_rbyd_alloc(lfs, &sibling, rbyd->rev+1);
err = lfsr_rbyd_alloc(lfs, &sibling);
if (err) {
return err;
}
@@ -3787,7 +3801,7 @@ static int lfsr_btree_commit(lfs_t *lfs,
// no parent? introduce a new trunk
if (pid == -1) {
int err = lfsr_rbyd_alloc(lfs, &parent, 1);
int err = lfsr_rbyd_alloc(lfs, &parent);
if (err) {
return err;
}
@@ -4067,7 +4081,7 @@ static int lfsr_btree_push(lfs_t *lfs, lfsr_btree_t *btree,
// inlined btree, need to expand into an rbyd
} else if (lfsr_btree_isinlined(btree)) {
lfsr_rbyd_t rbyd;
int err = lfsr_rbyd_alloc(lfs, &rbyd, 1);
int err = lfsr_rbyd_alloc(lfs, &rbyd);
if (err) {
return err;
}
@@ -4307,7 +4321,7 @@ static int lfsr_btree_split(lfs_t *lfs, lfsr_btree_t *btree,
// inlined btree, need to expand into an rbyd
if (lfsr_btree_isinlined(btree)) {
lfsr_rbyd_t rbyd;
int err = lfsr_rbyd_alloc(lfs, &rbyd, 1);
int err = lfsr_rbyd_alloc(lfs, &rbyd);
if (err) {
return err;
}
@@ -4670,7 +4684,6 @@ static int lfsr_mdir_alloc(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_ssize_t mid) {
// mark mdir as needing compaction
mdir->rbyd.off = lfs->cfg->block_size;
mdir->rbyd.trunk = 0;
mdir->rbyd.rev = rev;
return 0;
}
@@ -4829,27 +4842,50 @@ static int lfsr_mdir_compact_(lfs_t *lfs, lfsr_mdir_t *mdir,
const lfsr_mdir_t *source,
const lfsr_attr_t *attr1s, lfs_size_t attr1_count,
const lfsr_attr_t *attr2s, lfs_size_t attr2_count) {
// TODO different indicator?
// note mid indicates some special cases:
// - mid = manchor => never alloc (mroot anchor)
// - mid = wl => only alloc if mdir is tired (wear-leveling)
// - otherwise => always alloc, use this mid (new mdir)
if (mid != LFSR_MID_MANCHOR && (mid != LFSR_MID_WL || (
lfs->cfg->block_cycles > 0
&& (mdir->rbyd.rev+1) % lfs->cfg->block_cycles == 0))) {
// allocate a new mdir for relocation
int err = lfsr_mdir_alloc(lfs, mdir,
(mid != LFSR_MID_WL ? mid : mdir->mid));
if (err) {
uint32_t rev;
if (mid != LFSR_MID_MANCHOR) {
// first thing we need to do is read our current revision count
int err = lfsr_bd_read(lfs, source->rbyd.block, 0, sizeof(uint32_t),
&rev, sizeof(uint32_t));
if (err && err != LFS_ERR_CORRUPT) {
return err;
}
// note we allow corrupt errors here, as long as they are consistent
rev = (err != LFS_ERR_CORRUPT ? lfs_fromle32_(&rev) : 0);
// decide if we need to relocate
if (mid != LFSR_MID_WL || (
lfs->cfg->block_cycles > 0
// TODO rev things
&& (rev + 1) % lfs->cfg->block_cycles == 0)) {
// allocate a new mdir for relocation
err = lfsr_mdir_alloc(lfs, mdir,
(mid != LFSR_MID_WL ? mid : mdir->mid));
if (err) {
return err;
}
// read the new revision count
//
// we use whatever is on-disk to avoid needing to rewrite the
// redund block
err = lfsr_bd_read(lfs, mdir->rbyd.block, 0, sizeof(uint32_t),
&rev, sizeof(uint32_t));
if (err && err != LFS_ERR_CORRUPT) {
return err;
}
// note we allow corrupt errors here, as long as they are consistent
rev = (err != LFS_ERR_CORRUPT ? lfs_fromle32_(&rev) : 0);
}
}
// swap our rbyds
lfs_swap32(&mdir->rbyd.block, &mdir->other_block);
// update our revision count
// TODO rev things
mdir->rbyd.rev += 1;
mdir->rbyd.off = 0;
mdir->rbyd.trunk = 0;
mdir->rbyd.weight = 0;
@@ -4861,6 +4897,13 @@ static int lfsr_mdir_compact_(lfs_t *lfs, lfsr_mdir_t *mdir,
return err;
}
// increment our revision count and write it to our rbyd
// TODO rev things
err = lfsr_rbyd_appendrev(lfs, &mdir->rbyd, rev + 1);
if (err) {
return err;
}
// copy over attrs
err = lfsr_rbyd_compact(lfs, &mdir->rbyd, start_id, end_id, false,
&source->rbyd);
@@ -4891,7 +4934,7 @@ static int lfsr_mdir_compact_(lfs_t *lfs, lfsr_mdir_t *mdir,
// drop commit if weight goes to zero
if (mdir->mid >= 0 && mdir->rbyd.weight == 0) {
lfs_cache_drop(lfs, &lfs->pcache);
lfs_cache_zero(lfs, &lfs->pcache);
// finalize commit
} else {
@@ -4921,7 +4964,7 @@ static int lfsr_mdir_commit_(lfs_t *lfs, lfsr_mdir_t *mdir,
// drop commit if weight goes to zero
if (mdir_.mid >= 0 && mdir_.rbyd.weight == 0) {
lfs_cache_drop(lfs, &lfs->pcache);
lfs_cache_zero(lfs, &lfs->pcache);
// finalize commit
} else {
@@ -6151,16 +6194,21 @@ static int lfsr_formatinited(lfs_t *lfs) {
return d;
}
for (int i = 0; i < 2; i++) {
for (uint32_t i = 0; i < 2; i++) {
// write superblock to both rbyds in the root mroot to hopefully
// avoid mounting an older filesystem on disk
lfsr_rbyd_t rbyd = {.block=i, .rev=i-1, .off=0, .trunk=0};
lfsr_rbyd_t rbyd = {.block=i, .off=0, .trunk=0};
int err = lfsr_bd_erase(lfs, rbyd.block);
if (err) {
return err;
}
err = lfsr_rbyd_appendrev(lfs, &rbyd, (uint32_t)i - 1);
if (err) {
return err;
}
err = lfsr_rbyd_commit(lfs, &rbyd, LFSR_ATTRS(
LFSR_ATTR(-1, SUPERMAGIC, 0, "littlefs", 8),
LFSR_ATTR(-1, SUPERCONFIG, 0, buf, d)));
-1
View File
@@ -340,7 +340,6 @@ typedef struct lfsr_rbyd {
// off=block_size => rbyd not erased/needs compaction
lfs_off_t off;
lfs_off_t trunk;
uint32_t rev;
uint32_t crc;
} lfsr_rbyd_t;
-94
View File
@@ -21,7 +21,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -59,7 +58,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -98,7 +96,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -132,7 +129,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -255,7 +251,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -380,7 +375,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -472,7 +466,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -566,7 +559,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -630,7 +622,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -696,7 +687,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -776,7 +766,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -920,7 +909,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -1092,7 +1080,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -1264,7 +1251,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -1444,7 +1430,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -1652,7 +1637,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -1819,7 +1803,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2007,7 +1990,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2099,7 +2081,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2181,7 +2162,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2271,7 +2251,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2367,7 +2346,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2440,7 +2418,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2512,7 +2489,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2623,7 +2599,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2686,7 +2661,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2799,7 +2773,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -2950,7 +2923,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -3045,7 +3017,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -3195,7 +3166,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -3431,7 +3401,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -3520,7 +3489,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -3647,7 +3615,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -3783,7 +3750,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -3931,7 +3897,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4093,7 +4058,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4196,7 +4160,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4290,7 +4253,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4397,7 +4359,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4510,7 +4471,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4603,7 +4563,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4691,7 +4650,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4760,7 +4718,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -4995,7 +4952,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -5257,7 +5213,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -5372,7 +5327,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -5477,7 +5431,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -5644,7 +5597,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -5822,7 +5774,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -5933,7 +5884,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -6043,7 +5993,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -6172,7 +6121,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -6367,7 +6315,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -6492,7 +6439,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -6584,7 +6530,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -6724,7 +6669,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -6881,7 +6825,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -7008,7 +6951,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -7255,7 +7197,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -7410,7 +7351,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -7601,7 +7541,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -7726,7 +7665,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -7865,7 +7803,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -7980,7 +7917,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -8114,7 +8050,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -8257,7 +8192,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -8418,7 +8352,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -8553,7 +8486,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -8791,7 +8723,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -8901,7 +8832,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -8988,7 +8918,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -9074,7 +9003,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -9747,7 +9675,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10004,7 +9931,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10116,7 +10042,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10238,7 +10163,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10365,7 +10289,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10501,7 +10424,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10650,7 +10572,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10777,7 +10698,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -10913,7 +10833,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -11061,7 +10980,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -11215,7 +11133,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -11395,7 +11312,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -11578,7 +11494,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -11802,7 +11717,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -11890,7 +11804,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -12028,7 +11941,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -12168,7 +12080,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -12257,7 +12168,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -12403,7 +12313,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -12551,7 +12460,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -12638,7 +12546,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,
@@ -12778,7 +12685,6 @@ code = '''
lfsr_rbyd_t init_rbyd = {
.block = 0,
.rev = 1,
.off = 0,
.crc = 0,
.trunk = 0,