diff --git a/lfs.c b/lfs.c index 4034fe39..6cb9168b 100644 --- a/lfs.c +++ b/lfs.c @@ -457,7 +457,6 @@ enum lfsr_tag_type { LFSR_TAG_MKBRANCH = 0x0400, LFSR_TAG_MKREG = 0x0410, LFSR_TAG_MKDIR = 0x0420, - LFSR_TAG_RM = 0x0402, // in-device only LFSR_TAG_STRUCT = 0x0800, LFSR_TAG_INLINED = 0x0800, @@ -1508,6 +1507,7 @@ static int lfsr_rbyd_fetch(lfs_t *lfs, lfsr_rbyd_t *rbyd, static int lfsr_rbyd_lookup(lfs_t *lfs, const lfsr_rbyd_t *rbyd, lfsr_tag_t tag, lfs_ssize_t id, lfsr_tag_t *tag_, lfs_ssize_t *id_, lfs_size_t *weight_, + // TODO should this take lfsr_data_t for consistency? lfs_off_t *off_, lfs_size_t *size_) { // tag must be non-zero! zero tags may deceptively look like they work but // fail when the tree contains a deleted id0 @@ -1596,6 +1596,7 @@ static lfs_ssize_t lfsr_rbyd_get(lfs_t *lfs, const lfsr_rbyd_t *rbyd, return LFS_ERR_NOENT; } + // TODO should this be its own lfsr_data_ function? lfs_size_t delta = lfs_min(size, size_); err = lfs_bd_read(lfs, &lfs->pcache, &lfs->rcache, delta, @@ -1607,6 +1608,120 @@ static lfs_ssize_t lfsr_rbyd_get(lfs_t *lfs, const lfsr_rbyd_t *rbyd, return size_; } +//// TODO should we merge this into lfsr_rbyd_lookup? +//static int lfsr_rbyd_lookupattrs(lfs_t *lfs, +// const lfsr_rbyd_t *rbyd, const struct lfsr_attr *attrs, +// lfsr_tag_t tag, lfs_ssize_t id, +// lfsr_tag_t *tag_, lfs_ssize_t *id_, +// lfsr_data_t *data_, lfs_size_t *weight_) { +// // tag must be non-zero! zero tags may deceptively look like they work but +// // fail when the tree contains a deleted id0 +// LFS_ASSERT(tag != 0); +// +// lfs_ssize_t lower_id = -1; +// lfs_ssize_t upper_id = rbyd->weight; +// lfsr_tag_t upper_tag = -1; +// +// +// // TODO hmm, reverse iteration over a linked-list? this is a bad design +// // first try to find tag in the unwritten attributes +// lfs_ssize_t attr_best_id = 0; +// lfs_tag_t attr_best_tag = 0; +// lfs_ssize_t attr_weight = 0; +// unsigned attr_count = 0; +// for (const struct lfsr_attr *attr = attrs; attr; attr = attr->next) { +// attr_count += 1; +// } +// for (unsigned i = 0; i < count; i++) { +// const struct lfsr_attr *attr = attrs; +// for (unsigned j = 0; j < count-1-i; j++) { +// attr = attr->next; +// } +// +// // TODO can this be simplified a bit? +// if (lfsr_tag_ismk(attr->tag)) { +// if (attr->id < id) { +// id -= 1; +// } +// } else if (attr->tag == LFSR_TAG_RM) { +// if (attr->id < id) { +// id += attr->size; +// } +// } else if (attr->tag == LFSR_TAG_GROW) { +// if (attr->id < id) { +// id -= attr->size; +// } +// } else if (attr->tag == LFSR_TAG_SHRINK) { +// if (attr->id < id) { +// id += attr->size; +// } +// } else if (attr->tag == LFSR_TAG_FROM) { +// // TODO +// LFS_ASSERT(false); +// } else if (lfsr_tag_isrm(attr->tag)) { +// } else { +// if (attr->id == id +// && attr->tag >= tag +// && (attr->id < best_attr_id +// || (attr->id == best_attr_id +// && attr->tag < best_attr_tag))) { +// // TODO track best attr? +// best_attr_id = attr->id; +// best_attr_tag = attr->tag; +// } +// } +// } +// +// lfs_off_t off_; +// lfs_size_t size_; +// int err = lfsr_rbyd_lookup(lfs, rbyd, tag, id, +// tag_, id_, weight_, &off_, &size_); +// if (err) { +// return err; +// } +// +// if (data_) { +// *data_ = LFSR_DATA_DISK(rbyd->block, off_, size_); +// } +// +// return 0; +//} +// +//// TODO do we need this function? +//static lfs_ssize_t lfsr_rbyd_getattrs(lfs_t *lfs, +// const lfsr_rbyd_t *rbyd, const struct lfsr_attr *attrs, +// lfsr_tag_t tag, lfs_ssize_t id, void *buffer, lfs_size_t size) { +// lfsr_tag_t tag_; +// lfs_ssize_t id_; +// lfsr_data_t data_; +// int err = lfsr_rbyd_lookupattrs(lfs, rbyd, attrs, tag, id, +// &tag_, &id_, &data_, NULL); +// if (err) { +// return err; +// } +// +// // lookup finds the next-smallest tag, for get, we need to fail +// // if it's not an exact match +// if (id_ != id || tag_ != tag) { +// return LFS_ERR_NOENT; +// } +// +// // TODO should this be its own lfsr_data_ function? +// lfs_size_t delta = lfs_min(size, lfsr_data_len(data_)); +// if (!lfsr_data_ondisk(data_)) { +// memcpy(buffer, data_.u.buf, delta); +// } else { +// err = lfs_bd_read(lfs, +// &lfs->pcache, &lfs->rcache, delta, +// data_.u.disk.block, data_.u.disk.off, buffer, delta); +// if (err) { +// return err; +// } +// } +// +// return lfsr_data_len(data_); +//} + static lfs_ssize_t lfsr_rbyd_compactedsize(lfs_t *lfs, const lfsr_rbyd_t *rbyd, lfs_ssize_t start, lfs_ssize_t stop) { // find the strict upper bound on the amount of disk taken by a range of @@ -1838,44 +1953,8 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_, lfs_ssize_t id_; lfsr_tag_t other_tag_; lfs_ssize_t other_id_; - if (lfsr_tag_ismk(tag)) { + if (tag == LFSR_TAG_GROW) { LFS_ASSERT(id <= rbyd_->weight); - rbyd_->weight += 1; - - // In-driver, mk tags implicitly grows the weight by one, this - // simplifies a few things. On-disk, however, we want to make this - // explicit so fetch parses fewer things. - // - // We can do this by prepending mk trunks with isolated grow tags. But - // this only works because we always immediately replace the grow trunk - // with our mk trunk! - // - // Note this also makes the order of operations with our current branch - // above and new trunk below a bit sensitive. - int err = lfsr_rbyd_progtag(lfs, rbyd_, - LFSR_TAG_GROW, id, 1, &rbyd_->crc); - if (err) { - return err; - } - - tag_ = 0; - id_ = id; - other_tag_ = tag_; - other_id_ = id_; - } else if (tag == LFSR_TAG_RM) { - LFS_ASSERT(id < rbyd_->weight); - LFS_ASSERT(id >= size-1); - rbyd_->weight -= size; - - // rm tags are just an in-driver convenience - tag = LFSR_TAG_SHRINK; - - tag_ = 0; - id_ = id; - other_tag_ = tag_; - other_id_ = id_ + 1; - } else if (tag == LFSR_TAG_GROW) { - LFS_ASSERT(id < rbyd_->weight); // noop? if (size == 0) { return 0; @@ -1888,7 +1967,6 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_, other_id_ = id_; } else if (tag == LFSR_TAG_SHRINK) { LFS_ASSERT(id < rbyd_->weight); - LFS_ASSERT(id >= size-1); // noop? if (size == 0) { return 0; @@ -1898,7 +1976,7 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_, tag_ = 0; id_ = id; other_tag_ = tag_; - other_id_ = id_; + other_id_ = id_ + size; } else if (lfsr_tag_isrm(tag)) { LFS_ASSERT(id < rbyd_->weight); @@ -2218,11 +2296,6 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_, alt = LFSR_TAG_ALT(R, LE, tag_); weight = id_ - lower_id; - } else if (lfsr_tag_ismk(tag)) { - // increase weight when creating - alt = LFSR_TAG_ALT(R, GT, tag); - weight = upper_id - id - 1 + 1; - } else if (tag == LFSR_TAG_GROW) { // decrease weight when growing alt = LFSR_TAG_ALT(B, GT, 0); @@ -2922,9 +2995,9 @@ static int lfsr_btree_commit(lfs_t *lfs, return delta2; } - scratch_attrs[0] = *LFSR_ATTR( - RM, pid, NULL, pweight, - &scratch_attrs[1]); +// scratch_attrs[0] = *LFSR_ATTR( +// RM, pid, NULL, pweight, +// &scratch_attrs[1]); scratch_attrs[1] = *LFSR_ATTR( MKBRANCH, pid, NULL, 0, diff --git a/scripts/dbgrbyd.py b/scripts/dbgrbyd.py index 23ad581f..e04cd9a6 100755 --- a/scripts/dbgrbyd.py +++ b/scripts/dbgrbyd.py @@ -198,7 +198,9 @@ def show_log(block_size, data, rev, off, *, j_ += size if grow is not None: - if (tag & ~0x3f0) == 0x0400 and id == grow[1]: + if ((tag & ~0x3f0) == 0x0400 + and id >= grow[1] + and id < grow[1]+grow[2]): i, p = index(weights, id) weights[i:i+1] = [p+1, weights[i]-(p+1)] colors[i:i+1] = [COLORS[colors_i % len(COLORS)], colors[i]] @@ -214,7 +216,7 @@ def show_log(block_size, data, rev, off, *, if tag == 0x0006: i, _ = index(weights, id) weights[i] += size - grow = j, id + grow = j, id, size elif tag == 0x0016: i, _ = index(weights, id) if weights[i] == size and len(weights) > 1: diff --git a/tests/test_rbyd.toml b/tests/test_rbyd.toml index f11221d6..c513202e 100644 --- a/tests/test_rbyd.toml +++ b/tests/test_rbyd.toml @@ -4000,7 +4000,8 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; assert(rbyd.weight == 1); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4015,8 +4016,10 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))))) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4035,8 +4038,10 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))))) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4055,9 +4060,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))))))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4080,9 +4088,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))))))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4105,9 +4116,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))))))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4149,7 +4163,8 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; assert(rbyd.weight == 1); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -4166,9 +4181,11 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4187,9 +4204,11 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4208,11 +4227,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4235,11 +4257,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4262,11 +4287,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -4337,7 +4365,7 @@ code = ''' printf("] ---\n"); // build the attribute list for the current permutation - struct lfsr_attr attrs[N]; + struct lfsr_attr attrs[2*N]; for (unsigned j = 0; j < N; j++) { // adjust id based on future insertions uint16_t id = perm[j]; @@ -4347,10 +4375,12 @@ code = ''' } } - attrs[j] = *LFSR_ATTR( - MKREG, id, - names[perm[j] % 6], 4, - (j+1 < N) ? &attrs[j+1] : NULL); + attrs[2*j+0] = *LFSR_ATTR( + GROW, id, NULL, 1, + (2*j+1 < 2*N) ? &attrs[2*j+1] : NULL); + attrs[2*j+1] = *LFSR_ATTR( + MKREG, id, names[perm[j] % 6], 4, + (2*j+2 < 2*N) ? &attrs[2*j+2] : NULL); } // test the given permutation @@ -4465,8 +4495,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; } lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, cfg->block_size, NULL) => 0; @@ -4540,8 +4571,10 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, &tag_, &id_, NULL, &off_, &size_) => 0; @@ -4582,8 +4615,10 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, &tag_, &id_, NULL, &off_, &size_) => 0; @@ -4649,9 +4684,11 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, &tag_, &id_, NULL, &off_, &size_) => 0; @@ -4692,9 +4729,11 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, &tag_, &id_, NULL, &off_, &size_) => 0; @@ -4784,7 +4823,7 @@ code = ''' printf("] ---\n"); // build the attribute list for the current permutation - struct lfsr_attr attrs[N]; + struct lfsr_attr attrs[2*N]; for (unsigned j = 0; j < N; j++) { // adjust id based on future insertions uint16_t id = perm[j]; @@ -4794,10 +4833,12 @@ code = ''' } } - attrs[j] = *LFSR_ATTR( - MKREG, id, - names[perm[j] % 6], 4, - (j+1 < N) ? &attrs[j+1] : NULL); + attrs[2*j+0] = *LFSR_ATTR( + GROW, id, NULL, 1, + (2*j+1 < 2*N) ? &attrs[2*j+1] : NULL); + attrs[2*j+1] = *LFSR_ATTR( + MKREG, id, names[perm[j] % 6], 4, + (2*j+2 < 2*N) ? &attrs[2*j+2] : NULL); } // test the given permutation @@ -4909,8 +4950,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; } lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, cfg->block_size, NULL) => 0; @@ -5000,7 +5042,8 @@ code = ''' x = x % (rbyd.weight+1); int err = lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, x, names[x % 6], 4, NULL)); + LFSR_ATTR(GROW, x, NULL, 1, + LFSR_ATTR(MKREG, x, names[x % 6], 4, NULL))); if (err == LFS_ERR_RANGE) { break; } @@ -5049,8 +5092,9 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL))) => 0; + LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)))) => 0; assert(rbyd.weight == 1); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -5069,10 +5113,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))))) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -5099,10 +5145,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 0, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL))))))) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -5129,12 +5177,15 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 2, NULL, 1, LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL)))))))))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -5186,12 +5237,15 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 0, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, LFSR_ATTR(UATTR(1), 1, "\xcc\xcc", 2, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)))))))))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -5226,12 +5280,15 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, LFSR_ATTR(UATTR(1), 1, "\xcc\xcc", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL)))))))))) => 0; assert(rbyd.weight == 3); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -5285,7 +5342,8 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; @@ -5306,11 +5364,13 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL)) => 0; @@ -5339,11 +5399,13 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xbb\xbb", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; @@ -5372,15 +5434,18 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL)) => 0; @@ -5434,15 +5499,18 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xbb\xbb", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 1, "\xcc\xcc", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; @@ -5479,15 +5547,18 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xcc\xcc\xcc\xcc", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 1, "\xcc\xcc", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL)) => 0; @@ -5573,7 +5644,7 @@ code = ''' printf("] ---\n"); // build the attribute list for the current permutation - struct lfsr_attr attrs[N+N*M]; + struct lfsr_attr attrs[(2+M)*N]; for (unsigned j = 0; j < N; j++) { // adjust id based on future insertions uint16_t id = perm[j]; @@ -5583,16 +5654,19 @@ code = ''' } } - attrs[j*(M+1)] = *LFSR_ATTR( - MKREG, id, - names[perm[j] % 6], 4, - (j*(M+1)+1 < N+N*M) ? &attrs[j*(M+1)+1] : NULL); + attrs[(2+M)*j+0] = *LFSR_ATTR( + GROW, id, NULL, 1, + ((2+M)*j+1 < (2+M)*N) ? &attrs[(2+M)*j+1] : NULL); + attrs[(2+M)*j+1] = *LFSR_ATTR( + MKREG, id, names[perm[j] % 6], 4, + ((2+M)*j+2 < (2+M)*N) ? &attrs[(2+M)*j+2] : NULL); // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { - attrs[j*(M+1)+u+1] = *LFSR_ATTR( - UATTR(u+1), id, - names[perm[j] % 6], 2, - (j*(M+1)+u+1+1 < N+N*M) ? &attrs[j*(M+1)+u+1+1] : NULL); + attrs[(2+M)*j+2+u] = *LFSR_ATTR( + UATTR(u+1), id, names[perm[j] % 6], 2, + ((2+M)*j+2+u+1 < (2+M)*N) + ? &attrs[(2+M)*j+2+u+1] + : NULL); } } @@ -5715,8 +5789,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -5801,10 +5876,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, &tag_, &id_, NULL, &off_, &size_) => 0; @@ -5873,10 +5950,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 0, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL))))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, &tag_, &id_, NULL, &off_, &size_) => 0; @@ -5970,11 +6049,13 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL)) => 0; @@ -6045,11 +6126,13 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xbb\xbb", 2, NULL)) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)) => 0; @@ -6170,7 +6253,7 @@ code = ''' printf("] ---\n"); // build the attribute list for the current permutation - struct lfsr_attr attrs[N+N*M]; + struct lfsr_attr attrs[N*(2+M)]; for (unsigned j = 0; j < N; j++) { // adjust id based on future insertions uint16_t id = perm[j]; @@ -6180,16 +6263,19 @@ code = ''' } } - attrs[j*(M+1)] = *LFSR_ATTR( - MKREG, id, - names[perm[j] % 6], 4, - (j*(M+1)+1 < N+N*M) ? &attrs[j*(M+1)+1] : NULL); + attrs[(2+M)*j+0] = *LFSR_ATTR( + GROW, id, NULL, 1, + ((2+M)*j+1 < N*(2+M)) ? &attrs[(2+M)*j+1] : NULL); + attrs[(2+M)*j+1] = *LFSR_ATTR( + MKREG, id, names[perm[j] % 6], 4, + ((2+M)*j+2 < N*(2+M)) ? &attrs[(2+M)*j+2] : NULL); // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { - attrs[j*(M+1)+u+1] = *LFSR_ATTR( - UATTR(u+1), id, - names[perm[j] % 6], 2, - (j*(M+1)+u+1+1 < N+N*M) ? &attrs[j*(M+1)+u+1+1] : NULL); + attrs[(2+M)*j+2+u] = *LFSR_ATTR( + UATTR(u+1), id, names[perm[j] % 6], 2, + ((2+M)*j+2+u+1 < N*(2+M)) + ? &attrs[(2+M)*j+2+u+1] + : NULL); } } @@ -6315,8 +6401,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -6416,8 +6503,9 @@ code = ''' for (unsigned j = 0; j < N; j++) { lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, j, NULL, 1, LFSR_ATTR(MKREG, j, names[j % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -6590,8 +6678,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -6770,8 +6859,9 @@ code = ''' for (unsigned j = 0; j < N; j++) { lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, j, NULL, 1, LFSR_ATTR(MKREG, j, names[j % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -6921,15 +7011,17 @@ code = ''' // build a single attribute list with all attributes, if this fails // it should fail atomically - struct lfsr_attr attrs[M+1]; + struct lfsr_attr attrs[2+M]; attrs[0] = *LFSR_ATTR( - MKREG, x, - names[x % 6], 4, M > 0 ? &attrs[1] : NULL); + GROW, x, NULL, 1, + &attrs[1]); + attrs[1] = *LFSR_ATTR( + MKREG, x, names[x % 6], 4, + M > 0 ? &attrs[2] : NULL); for (unsigned u = 0; u < M; u++) { - attrs[1+u] = *LFSR_ATTR( - UATTR(u+1), x, - names[x % 6], 2, - (u+1 < M) ? &attrs[1+u+1] : NULL); + attrs[2+u] = *LFSR_ATTR( + UATTR(u+1), x, names[x % 6], 2, + (2+u+1 < 2+M) ? &attrs[2+u+1] : NULL); } int err = lfsr_rbyd_commit(&lfs, &rbyd, attrs); @@ -6989,10 +7081,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 1, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 1, NULL, 1, NULL)) => 0; assert(rbyd.weight == 1); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -7009,10 +7103,12 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)) => 0; assert(rbyd.weight == 1); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -7029,11 +7125,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 2, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 2, NULL, 1, NULL)) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -7052,11 +7151,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -7075,11 +7177,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 1, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 1, NULL, 1, NULL)) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -7117,12 +7222,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 1, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 1, NULL, 1, NULL)) => 0; assert(rbyd.weight == 1); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -7153,12 +7260,14 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)) => 0; assert(rbyd.weight == 1); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -7189,14 +7298,17 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 2, NULL, 1, LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL)))))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 2, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 2, NULL, 1, NULL)) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) => 4; @@ -7238,14 +7350,17 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 2, NULL, 1, LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL)))))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -7288,14 +7403,17 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 2, NULL, 1, LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL)))))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 1, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 1, NULL, 1, NULL)) => 0; assert(rbyd.weight == 2); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -7403,8 +7521,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; } assert(rbyd.weight == N); @@ -7426,7 +7545,7 @@ code = ''' lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, j, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, j, NULL, 1, NULL)) => 0; assert(rbyd.weight == N-1); lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, @@ -7446,7 +7565,8 @@ code = ''' // try recreating the id to make sure things still work printf("--- create: %d ---\n", j); lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, j, names[j % 6], 6, NULL)) => 0; + LFSR_ATTR(GROW, j, NULL, 1, + LFSR_ATTR(MKREG, j, names[j % 6], 6, NULL))) => 0; assert(rbyd.weight == N); lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, @@ -7572,8 +7692,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -7601,7 +7722,7 @@ code = ''' lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, j, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, j, NULL, 1, NULL)) => 0; assert(rbyd.weight == N-1); lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, @@ -7633,7 +7754,8 @@ code = ''' // try recreating the id to make sure things still work printf("--- create: %d ---\n", j); lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, j, names[j % 6], 6, NULL)) => 0; + LFSR_ATTR(GROW, j, NULL, 1, + LFSR_ATTR(MKREG, j, names[j % 6], 6, NULL))) => 0; for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(u+1), j, names[j % 6], 3, NULL)) => 0; @@ -7777,8 +7899,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; } assert(rbyd.weight == N); @@ -7800,7 +7923,7 @@ code = ''' lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, j, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, j, NULL, 1, NULL)) => 0; assert(rbyd.weight == N-1); // try traversing over the tags @@ -7922,8 +8045,9 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, names[perm[j] % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -7951,7 +8075,7 @@ code = ''' lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, j, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, j, NULL, 1, NULL)) => 0; assert(rbyd.weight == N-1); // try traversing over the tags @@ -8042,9 +8166,10 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8059,11 +8184,13 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL))) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8078,11 +8205,13 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; + LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, NULL))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 1, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL))) => 0; + LFSR_ATTR(SHRINK, 1, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8097,13 +8226,16 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL)))) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8118,13 +8250,16 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL)))) => 0; + LFSR_ATTR(GROW, 2, NULL, 1, + LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 2, NULL, 1, - LFSR_ATTR(RM, 1, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL)))) => 0; + LFSR_ATTR(SHRINK, 2, NULL, 1, + LFSR_ATTR(SHRINK, 1, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8158,10 +8293,11 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, - LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL))) => 0; + LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, NULL)))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8176,13 +8312,15 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL))) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8197,13 +8335,15 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, NULL))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 1, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL))) => 0; + LFSR_ATTR(SHRINK, 1, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8218,16 +8358,19 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 2, NULL, 1, LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL)))))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 0, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL)))) => 0; + LFSR_ATTR(SHRINK, 0, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8242,16 +8385,19 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, + LFSR_ATTR(GROW, 2, NULL, 1, LFSR_ATTR(MKREG, 2, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL))))))) => 0; + LFSR_ATTR(UATTR(1), 2, "\xcc\xcc", 2, NULL)))))))))) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, 2, NULL, 1, - LFSR_ATTR(RM, 1, NULL, 1, - LFSR_ATTR(RM, 0, NULL, 1, NULL)))) => 0; + LFSR_ATTR(SHRINK, 2, NULL, 1, + LFSR_ATTR(SHRINK, 1, NULL, 1, + LFSR_ATTR(SHRINK, 0, NULL, 1, NULL)))) => 0; assert(rbyd.weight == 0); lfsr_rbyd_get(&lfs, &rbyd, LFSR_TAG_MKREG, 0, buffer, 4) @@ -8303,8 +8449,9 @@ code = ''' for (unsigned j = 0; j < N; j++) { lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, j, NULL, 1, LFSR_ATTR(MKREG, j, names[j % 6], 4, - NULL)) => 0; + NULL))) => 0; } assert(rbyd.weight == N); @@ -8353,7 +8500,7 @@ code = ''' lfs_size_t rbyd_weight_before = rbyd.weight; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, id, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, id, NULL, 1, NULL)) => 0; assert(rbyd.weight == rbyd_weight_before-1); } @@ -8366,8 +8513,9 @@ code = ''' // try resuming from all tags being removed lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa\xaa\xaa", 6, - NULL)) => 0; + NULL))) => 0; assert(rbyd.weight == 1); lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, cfg->block_size, NULL) => 0; @@ -8459,8 +8607,9 @@ code = ''' for (unsigned j = 0; j < N; j++) { lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, j, NULL, 1, LFSR_ATTR(MKREG, j, names[j % 6], 4, - NULL)) => 0; + NULL))) => 0; // note uattrs have a smaller size to help debugging for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, @@ -8515,7 +8664,7 @@ code = ''' lfs_size_t rbyd_weight_before = rbyd.weight; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, id, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, id, NULL, 1, NULL)) => 0; assert(rbyd.weight == rbyd_weight_before-1); } @@ -8528,8 +8677,9 @@ code = ''' // try resuming from all tags being removed lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa\xaa\xaa", 6, - NULL)) => 0; + NULL))) => 0; for (unsigned u = 0; u < M; u++) { lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(u+1), 0, "\xaa\xaa\xaa", 3, @@ -8668,15 +8818,16 @@ code = ''' count += 1; // update our rbyd lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, &alpha[i % 26], 1, - NULL)) => 0; + NULL))) => 0; } else { // update our sim memmove(sim+id, sim+id+1, count-id-1); count -= 1; // update our rbyd lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, id, NULL, 1, + LFSR_ATTR(SHRINK, id, NULL, 1, NULL)) => 0; } } @@ -8760,13 +8911,14 @@ code = ''' count += 1; // update our rbyd lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id, NULL, 1, LFSR_ATTR(MKREG, id, &alpha[i % 26], 1, - NULL)) => 0; + NULL))) => 0; } else { count -= 1; // update our rbyd lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, id, NULL, 1, + LFSR_ATTR(SHRINK, id, NULL, 1, NULL)) => 0; } } @@ -8774,7 +8926,7 @@ code = ''' // our tree should be strictly <= 2*log(n)+1, assume tags are strictly // <=12 bytes, note this only holds true with byte-level progs if (PROG_SIZE == 1) { - assert(worst_size <= N*12*(2*lfs_nlog2(N)+1)+1); + assert(worst_size <= 2*N*12*(2*lfs_nlog2(N)+1)+1); } ''' @@ -8806,7 +8958,8 @@ code = ''' rbyd = init_rbyd; lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL)) => 0; + LFSR_ATTR(GROW, 0, NULL, 1, + LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, NULL))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_MKREG, 0, &tag_, &id_, &weight_, &off_, &size_) => 0; @@ -8825,8 +8978,8 @@ code = ''' // make id2 with weight w2 lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(GROW, 1, NULL, 2, + LFSR_ATTR(MKREG, 2, "\xbb\xbb\xbb\xbb", 4, NULL))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_MKREG, 0, @@ -8858,8 +9011,8 @@ code = ''' // make id5 with weight w3 lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 3, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(GROW, 3, NULL, 2, + LFSR_ATTR(GROW, 3, NULL, 3, + LFSR_ATTR(MKREG, 5, "\xcc\xcc\xcc\xcc", 4, NULL))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_MKREG, 0, @@ -8903,8 +9056,8 @@ code = ''' // make id9 with weight w4 lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 6, "\xdd\xdd\xdd\xdd", 4, - LFSR_ATTR(GROW, 6, NULL, 3, + LFSR_ATTR(GROW, 6, NULL, 4, + LFSR_ATTR(MKREG, 9, "\xdd\xdd\xdd\xdd", 4, NULL))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_MKREG, 0, @@ -8960,8 +9113,8 @@ code = ''' // make id14 with weight w5 lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, 10, "\xee\xee\xee\xee", 4, - LFSR_ATTR(GROW, 10, NULL, 4, + LFSR_ATTR(GROW, 10, NULL, 5, + LFSR_ATTR(MKREG, 14, "\xee\xee\xee\xee", 4, NULL))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_MKREG, 0, @@ -9054,20 +9207,21 @@ code = ''' lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, // make id0 with weight w1 + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, // make id2 with weight w2 - LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, - LFSR_ATTR(GROW, 1, NULL, 1, + LFSR_ATTR(GROW, 1, NULL, 2, + LFSR_ATTR(MKREG, 2, "\xbb\xbb\xbb\xbb", 4, // make id5 with weight w3 - LFSR_ATTR(MKREG, 3, "\xcc\xcc\xcc\xcc", 4, - LFSR_ATTR(GROW, 3, NULL, 2, + LFSR_ATTR(GROW, 3, NULL, 3, + LFSR_ATTR(MKREG, 5, "\xcc\xcc\xcc\xcc", 4, // make id9 with weight w4 - LFSR_ATTR(MKREG, 6, "\xdd\xdd\xdd\xdd", 4, - LFSR_ATTR(GROW, 6, NULL, 3, + LFSR_ATTR(GROW, 6, NULL, 4, + LFSR_ATTR(MKREG, 9, "\xdd\xdd\xdd\xdd", 4, // make id14 with weight w5 - LFSR_ATTR(MKREG, 10, "\xee\xee\xee\xee", 4, - LFSR_ATTR(GROW, 10, NULL, 4, - NULL)))))))))) => 0; + LFSR_ATTR(GROW, 10, NULL, 5, + LFSR_ATTR(MKREG, 14, "\xee\xee\xee\xee", 4, + NULL))))))))))) => 0; // traverse, finding tags and weights lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, @@ -9206,8 +9360,8 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, - LFSR_ATTR(GROW, id*W, NULL, W-1, + LFSR_ATTR(GROW, id*W, NULL, W, + LFSR_ATTR(MKREG, id*W+W-1, names[perm[j] % 6], 4, NULL))) => 0; } @@ -9313,8 +9467,8 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, - LFSR_ATTR(GROW, id*W, NULL, W-1, + LFSR_ATTR(GROW, id*W, NULL, W, + LFSR_ATTR(MKREG, id*W+W-1, names[perm[j] % 6], 4, NULL))) => 0; } @@ -9385,9 +9539,10 @@ code = ''' lfs_bd_erase(&lfs, rbyd.block) => 0; lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(3), -1, "unrelated", 9, + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, - LFSR_ATTR(UATTR(2), 0, "\xaa\xaa", 2, NULL))))) => 0; + LFSR_ATTR(UATTR(2), 0, "\xaa\xaa", 2, NULL)))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_UATTR(3), -1, &tag_, &id_, &weight_, &off_, &size_) => 0; @@ -9442,11 +9597,12 @@ code = ''' // make id2 with weight w2 lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(UATTR(2), 2, "\xbb\xbb", 2, - NULL))))) => 0; + NULL)))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_UATTR(3), -1, &tag_, &id_, &weight_, &off_, &size_) => 0; @@ -9537,11 +9693,12 @@ code = ''' // make id5 with weight w3 lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 3, NULL, 1, LFSR_ATTR(MKREG, 3, "\xcc\xcc\xcc\xcc", 4, LFSR_ATTR(UATTR(1), 3, "\xcc\xcc", 2, LFSR_ATTR(GROW, 3, NULL, 2, LFSR_ATTR(UATTR(2), 5, "\xcc\xcc", 2, - NULL))))) => 0; + NULL)))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_UATTR(3), -1, &tag_, &id_, &weight_, &off_, &size_) => 0; @@ -9668,11 +9825,12 @@ code = ''' // make id9 with weight w4 lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 6, NULL, 1, LFSR_ATTR(MKREG, 6, "\xdd\xdd\xdd\xdd", 4, LFSR_ATTR(UATTR(1), 6, "\xdd\xdd", 2, LFSR_ATTR(GROW, 6, NULL, 3, LFSR_ATTR(UATTR(2), 9, "\xdd\xdd", 2, - NULL))))) => 0; + NULL)))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_UATTR(3), -1, &tag_, &id_, &weight_, &off_, &size_) => 0; @@ -9835,11 +9993,12 @@ code = ''' // make id14 with weight w5 lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, 10, NULL, 1, LFSR_ATTR(MKREG, 10, "\xee\xee\xee\xee", 4, LFSR_ATTR(UATTR(1), 10, "\xee\xee", 2, LFSR_ATTR(GROW, 10, NULL, 4, LFSR_ATTR(UATTR(2), 14, "\xee\xee", 2, - NULL))))) => 0; + NULL)))))) => 0; lfsr_rbyd_lookup(&lfs, &rbyd, LFSR_TAG_UATTR(3), -1, &tag_, &id_, &weight_, &off_, &size_) => 0; @@ -10064,30 +10223,35 @@ code = ''' lfsr_rbyd_commit(&lfs, &rbyd, LFSR_ATTR(UATTR(3), -1, "unrelated", 9, // make id0 with weight w1 + LFSR_ATTR(GROW, 0, NULL, 1, LFSR_ATTR(MKREG, 0, "\xaa\xaa\xaa\xaa", 4, LFSR_ATTR(UATTR(1), 0, "\xaa\xaa", 2, LFSR_ATTR(UATTR(2), 0, "\xaa\xaa", 2, // make id2 with weight w2 + LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(MKREG, 1, "\xbb\xbb\xbb\xbb", 4, LFSR_ATTR(UATTR(1), 1, "\xbb\xbb", 2, LFSR_ATTR(GROW, 1, NULL, 1, LFSR_ATTR(UATTR(2), 2, "\xbb\xbb", 2, // make id5 with weight w3 + LFSR_ATTR(GROW, 3, NULL, 1, LFSR_ATTR(MKREG, 3, "\xcc\xcc\xcc\xcc", 4, LFSR_ATTR(UATTR(1), 3, "\xcc\xcc", 2, LFSR_ATTR(GROW, 3, NULL, 2, LFSR_ATTR(UATTR(2), 5, "\xcc\xcc", 2, // make id9 with weight w4 + LFSR_ATTR(GROW, 6, NULL, 1, LFSR_ATTR(MKREG, 6, "\xdd\xdd\xdd\xdd", 4, LFSR_ATTR(UATTR(1), 6, "\xdd\xdd", 2, LFSR_ATTR(GROW, 6, NULL, 3, LFSR_ATTR(UATTR(2), 9, "\xdd\xdd", 2, // make id14 with weight w5 + LFSR_ATTR(GROW, 10, NULL, 1, LFSR_ATTR(MKREG, 10, "\xee\xee\xee\xee", 4, LFSR_ATTR(UATTR(1), 10, "\xee\xee", 2, LFSR_ATTR(GROW, 10, NULL, 4, LFSR_ATTR(UATTR(2), 14, "\xee\xee", 2, - NULL))))))))))))))))))))) => 0; + NULL)))))))))))))))))))))))))) => 0; // traverse, finding tags and weights lfsr_rbyd_lookup(&lfs, &rbyd, lfsr_tag_next(0), -1, @@ -10361,11 +10525,12 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id*W, NULL, 1, LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, LFSR_ATTR(UATTR(1), id*W, names[perm[j] % 6], 2, LFSR_ATTR(GROW, id*W, NULL, W-1, LFSR_ATTR(UATTR(2), id*W+W-1, names[perm[j] % 6], 2, - NULL))))) => 0; + NULL)))))) => 0; } lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, cfg->block_size, NULL) => 0; @@ -10491,11 +10656,12 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, + LFSR_ATTR(GROW, id*W, NULL, 1, LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, LFSR_ATTR(UATTR(1), id*W, names[perm[j] % 6], 2, LFSR_ATTR(GROW, id*W, NULL, W-1, LFSR_ATTR(UATTR(2), id*W+W-1, names[perm[j] % 6], 2, - NULL))))) => 0; + NULL)))))) => 0; } lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, cfg->block_size, NULL) => 0; @@ -10624,8 +10790,8 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, - LFSR_ATTR(GROW, id*W, NULL, W-1, + LFSR_ATTR(GROW, id*W, NULL, W, + LFSR_ATTR(MKREG, id*W+W-1, names[perm[j] % 6], 4, NULL))) => 0; } assert(rbyd.weight == N*W); @@ -10648,7 +10814,7 @@ code = ''' lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(GROW, j*W+W-1, NULL, 1, NULL)) => 0; + LFSR_ATTR(GROW, j*W, NULL, 1, NULL)) => 0; assert(rbyd.weight == N*W+1); lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, @@ -10771,8 +10937,8 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, - LFSR_ATTR(GROW, id*W, NULL, W-1, + LFSR_ATTR(GROW, id*W, NULL, W, + LFSR_ATTR(MKREG, id*W+W-1, names[perm[j] % 6], 4, NULL))) => 0; } assert(rbyd.weight == N*W); @@ -10795,7 +10961,7 @@ code = ''' lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(SHRINK, j*W+W-1, NULL, 1, NULL)) => 0; + LFSR_ATTR(SHRINK, j*W, NULL, 1, NULL)) => 0; assert(rbyd.weight == N*W-1); lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, @@ -10918,8 +11084,8 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, - LFSR_ATTR(GROW, id*W, NULL, W-1, + LFSR_ATTR(GROW, id*W, NULL, W, + LFSR_ATTR(MKREG, id*W+W-1, names[perm[j] % 6], 4, NULL))) => 0; } assert(rbyd.weight == N*W); @@ -10942,7 +11108,7 @@ code = ''' lfs_bd_flush(&lfs, &lfs.pcache, &lfs.rcache, false) => 0; lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(RM, j*W+W-1, NULL, W, NULL)) => 0; + LFSR_ATTR(SHRINK, j*W, NULL, W, NULL)) => 0; assert(rbyd.weight == (N-1)*W); lfsr_rbyd_fetch(&lfs, &rbyd, rbyd.block, @@ -10975,8 +11141,8 @@ code = ''' // try recreating the id to make sure things still work printf("--- create: %d ---\n", j); lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, j*W, names[j % 6], 6, - LFSR_ATTR(GROW, j*W, NULL, W-1, + LFSR_ATTR(GROW, j*W, NULL, W, + LFSR_ATTR(MKREG, j*W+W-1, names[j % 6], 6, NULL))) => 0; assert(rbyd.weight == N*W); @@ -11096,8 +11262,8 @@ code = ''' } lfsr_rbyd_commit(&lfs, &rbyd, - LFSR_ATTR(MKREG, id*W, names[perm[j] % 6], 4, - LFSR_ATTR(GROW, id*W, NULL, W-1, + LFSR_ATTR(GROW, id*W, NULL, W, + LFSR_ATTR(MKREG, id*W+W-1, names[perm[j] % 6], 4, NULL))) => 0; } assert(rbyd.weight == N*W);