CIRCT 20.0.0git
Loading...
Searching...
No Matches
HWTypeInterfaces.cpp
Go to the documentation of this file.
1//===- HWTypeInterfaces.cpp - Implement HW type interfaces ------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements type interfaces of the HW Dialect.
10//
11//===----------------------------------------------------------------------===//
12
14
15using namespace mlir;
16using namespace circt;
17using namespace hw;
18using namespace FieldIdImpl;
19
21 uint64_t fieldID) {
22 std::pair<Type, uint64_t> pair(type, fieldID);
23 while (pair.second) {
24 if (auto ftype = dyn_cast<FieldIDTypeInterface>(pair.first))
25 pair = ftype.getSubTypeByFieldID(pair.second);
26 else
27 llvm::report_fatal_error("fieldID indexing into a non-aggregate type");
28 }
29 return pair.first;
30}
31
32std::pair<Type, uint64_t>
33circt::hw::FieldIdImpl::getSubTypeByFieldID(Type type, uint64_t fieldID) {
34 if (!fieldID)
35 return {type, 0};
36 if (auto ftype = dyn_cast<FieldIDTypeInterface>(type))
37 return ftype.getSubTypeByFieldID(fieldID);
38
39 llvm::report_fatal_error("fieldID indexing into a non-aggregate type");
40}
41
43 if (auto ftype = dyn_cast<FieldIDTypeInterface>(type))
44 return ftype.getMaxFieldID();
45 return 0;
46}
47
48std::pair<uint64_t, bool>
50 uint64_t index) {
51 if (auto ftype = dyn_cast<FieldIDTypeInterface>(type))
52 return ftype.projectToChildFieldID(fieldID, index);
53 return {0, fieldID == 0};
54}
55
57 uint64_t fieldID) {
58 if (auto ftype = dyn_cast<FieldIDTypeInterface>(type))
59 return ftype.getIndexForFieldID(fieldID);
60 return 0;
61}
62
63uint64_t circt::hw::FieldIdImpl::getFieldID(Type type, uint64_t fieldID) {
64 if (auto ftype = dyn_cast<FieldIDTypeInterface>(type))
65 return ftype.getFieldID(fieldID);
66 return 0;
67}
68
69std::pair<uint64_t, uint64_t>
71 if (auto ftype = dyn_cast<FieldIDTypeInterface>(type))
72 return ftype.getIndexAndSubfieldID(fieldID);
73 return {0, fieldID == 0};
74}
75
76#include "circt/Dialect/HW/HWTypeInterfaces.cpp.inc"
std::pair< uint64_t, uint64_t > getIndexAndSubfieldID(Type type, uint64_t fieldID)
uint64_t getFieldID(Type type, uint64_t index)
std::pair<::mlir::Type, uint64_t > getSubTypeByFieldID(Type, uint64_t fieldID)
std::pair< uint64_t, bool > projectToChildFieldID(Type, uint64_t fieldID, uint64_t index)
::mlir::Type getFinalTypeByFieldID(Type type, uint64_t fieldID)
uint64_t getIndexForFieldID(Type type, uint64_t fieldID)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Definition hw.py:1