Given a well-formed 'type_dag', compute the bitSizes, skips, and type Merkle roots of all subexpressions. * For all 'i', 0 <= 'i' < 'len', * 'type_dag[i].typeMerkleRoot' will be the TMR * and 'type_dag[i].bitSize' will be the bitSize of the subexpression denoted by the slice * * (type_dag[i + 1])type_dag. * * and when 'type_dag[i]' represents a non-trivial 'PRODUCT' type, where on
| 33 | * Precondition: type type_dag[len] and 'type_dag' is well-formed. |
| 34 | */ |
| 35 | void simplicity_computeTypeAnalyses(type* type_dag, const size_t len) { |
| 36 | for (size_t i = 0; i < len; ++i) { |
| 37 | type_dag[i].skip = i; |
| 38 | switch (type_dag[i].kind) { |
| 39 | case ONE: |
| 40 | type_dag[i].bitSize = 0; |
| 41 | break; |
| 42 | case SUM: |
| 43 | type_dag[i].bitSize = bounded_max(type_dag[type_dag[i].typeArg[0]].bitSize, type_dag[type_dag[i].typeArg[1]].bitSize); |
| 44 | bounded_inc(&type_dag[i].bitSize); |
| 45 | break; |
| 46 | case PRODUCT: |
| 47 | type_dag[i].bitSize = bounded_add(type_dag[type_dag[i].typeArg[0]].bitSize, type_dag[type_dag[i].typeArg[1]].bitSize); |
| 48 | if (0 == type_dag[type_dag[i].typeArg[0]].bitSize) { |
| 49 | type_dag[i].skip = type_dag[type_dag[i].typeArg[1]].skip; |
| 50 | } else if (0 == type_dag[type_dag[i].typeArg[1]].bitSize) { |
| 51 | type_dag[i].skip = type_dag[type_dag[i].typeArg[0]].skip; |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | type_dag[i].typeMerkleRoot = tmrIV(type_dag[i].kind); |
| 56 | |
| 57 | uint32_t block[16]; |
| 58 | switch (type_dag[i].kind) { |
| 59 | case ONE: break; |
| 60 | case SUM: |
| 61 | case PRODUCT: |
| 62 | memcpy(block, type_dag[type_dag[i].typeArg[0]].typeMerkleRoot.s, sizeof(uint32_t[8])); |
| 63 | memcpy(block + 8, type_dag[type_dag[i].typeArg[1]].typeMerkleRoot.s, sizeof(uint32_t[8])); |
| 64 | simplicity_sha256_compression(type_dag[i].typeMerkleRoot.s, block); |
| 65 | } |
| 66 | } |
| 67 | } |
no test coverage detected