#include "type.h"
#include <stdbool.h>
#include "precomputed.h"
#include "simplicity_assert.h"
static sha256_midstate tmrIV(typeName kind) {
switch (kind) {
case ONE: return unitIV;
case SUM: return sumIV;
case PRODUCT: return prodIV;
}
SIMPLICITY_UNREACHABLE;
}
void rustsimplicity_0_6_computeTypeAnalyses(type* type_dag, const size_t len) {
for (size_t i = 0; i < len; ++i) {
type_dag[i].skip = i;
switch (type_dag[i].kind) {
case ONE:
type_dag[i].bitSize = 0;
break;
case SUM:
type_dag[i].bitSize = bounded_max(type_dag[type_dag[i].typeArg[0]].bitSize, type_dag[type_dag[i].typeArg[1]].bitSize);
bounded_inc(&type_dag[i].bitSize);
break;
case PRODUCT:
type_dag[i].bitSize = bounded_add(type_dag[type_dag[i].typeArg[0]].bitSize, type_dag[type_dag[i].typeArg[1]].bitSize);
if (0 == type_dag[type_dag[i].typeArg[0]].bitSize) {
type_dag[i].skip = type_dag[type_dag[i].typeArg[1]].skip;
} else if (0 == type_dag[type_dag[i].typeArg[1]].bitSize) {
type_dag[i].skip = type_dag[type_dag[i].typeArg[0]].skip;
}
}
type_dag[i].typeMerkleRoot = tmrIV(type_dag[i].kind);
uint32_t block[16];
switch (type_dag[i].kind) {
case ONE: break;
case SUM:
case PRODUCT:
memcpy(block, type_dag[type_dag[i].typeArg[0]].typeMerkleRoot.s, sizeof(uint32_t[8]));
memcpy(block + 8, type_dag[type_dag[i].typeArg[1]].typeMerkleRoot.s, sizeof(uint32_t[8]));
rustsimplicity_0_6_sha256_compression(type_dag[i].typeMerkleRoot.s, block);
}
}
}