33 if (isa<seq::ClockType>(type))
36 if (
auto intType = dyn_cast<IntegerType>(type))
37 return intType.getWidth();
39 auto computeForArrayType = [&](
auto arrayType) -> std::optional<uint64_t> {
45 auto width = std::max<uint64_t>(*maybeWidth, 8);
47 auto alignment = llvm::bit_ceil(std::min<uint64_t>(width, 16 * 8));
48 auto alignedWidth = llvm::alignToPowerOf2(width, alignment);
50 return arrayType.getNumElements() * alignedWidth;
53 if (
auto arrayType = dyn_cast<hw::ArrayType>(type))
54 return computeForArrayType(arrayType);
56 if (
auto arrayRefType = dyn_cast<ArrayRefType>(type))
57 return computeForArrayType(arrayRefType);
59 if (
auto structType = dyn_cast<hw::StructType>(type)) {
60 uint64_t structWidth = 0;
61 uint64_t structAlignment = 8;
62 for (
auto element : structType.getElements()) {
68 auto width = std::max<uint64_t>(*maybeWidth, 8);
70 auto alignment = llvm::bit_ceil(std::min<uint64_t>(width, 16 * 8));
71 auto alignedWidth = llvm::alignToPowerOf2(width, alignment);
74 structWidth = llvm::alignToPowerOf2(structWidth, alignment);
75 structWidth += alignedWidth;
77 structAlignment = std::max<uint64_t>(alignment, structAlignment);
80 return llvm::alignToPowerOf2(structWidth, structAlignment);
86 if (
auto unionType = dyn_cast<hw::UnionType>(type)) {
87 uint64_t unionWidth = 0;
88 uint64_t unionAlignment = 8;
89 for (
auto element : unionType.getElements()) {
95 auto width = std::max<uint64_t>(*maybeWidth, 8);
97 auto alignment = llvm::bit_ceil(std::min<uint64_t>(width, 16 * 8));
98 auto alignedWidth = llvm::alignToPowerOf2(width, alignment);
101 std::max<uint64_t>(unionWidth, element.offset + alignedWidth);
103 unionAlignment = std::max<uint64_t>(alignment, unionAlignment);
106 return llvm::alignToPowerOf2(unionWidth, unionAlignment);