CIRCT 20.0.0git
Loading...
Searching...
No Matches
MooreTypes.h
Go to the documentation of this file.
1//===- MooreTypes.h - Declare Moore dialect types ----------------*- 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 declares the types for the Moore dialect.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef CIRCT_DIALECT_MOORE_MOORETYPES_H
14#define CIRCT_DIALECT_MOORE_MOORETYPES_H
15
16#include "circt/Support/LLVM.h"
17#include "mlir/IR/Attributes.h"
18#include "mlir/IR/BuiltinAttributes.h"
19#include "mlir/IR/Location.h"
20#include "mlir/IR/Types.h"
21#include "mlir/Interfaces/MemorySlotInterfaces.h"
22#include <variant>
23
24namespace circt {
25namespace moore {
26
27class ArrayType;
28class AssocArrayType;
29class ChandleType;
30class EventType;
31class IntType;
32class OpenArrayType;
33class OpenUnpackedArrayType;
34class PackedType;
35class QueueType;
36class RealType;
37class StringType;
38class StructType;
39class UnionType;
40class UnpackedType;
41class UnpackedArrayType;
42class UnpackedStructType;
43class UnpackedUnionType;
44class VoidType;
45
46/// The number of values each bit of a type can assume.
47enum class Domain {
48 /// Two-valued types such as `bit` or `int`.
50 /// Four-valued types such as `logic` or `integer`.
52};
53
54//===----------------------------------------------------------------------===//
55// Unpacked Type
56//===----------------------------------------------------------------------===//
57
58/// An unpacked SystemVerilog type.
59///
60/// Unpacked types are a second level of types in SystemVerilog. They extend a
61/// core unpacked type with a variety of unpacked dimensions, depending on which
62/// syntactic construct generated the type (variable or otherwise). The core
63/// unpacked types are:
64///
65/// - Packed types
66/// - Non-integer types: `shortreal`, `real`, `realtime`
67/// - Unpacked structs and unions
68/// - `string`, `chandle`, `event`
69/// - Virtual interfaces
70/// - Class types
71/// - Covergroups
72/// - Unpacked named types
73/// - Unpacked type references
74///
75/// The unpacked dimensions are:
76///
77/// - Unsized (`[]`)
78/// - Arrays (`[x]`)
79/// - Ranges (`[x:y]`)
80/// - Associative (`[T]` or `[*]`)
81/// - Queues (`[$]` or `[$:x]`)
82class UnpackedType : public Type {
83public:
84 static bool classof(Type type) {
85 return llvm::isa<PackedType, StringType, ChandleType, EventType, RealType,
86 UnpackedArrayType, OpenUnpackedArrayType, AssocArrayType,
87 QueueType, UnpackedStructType, UnpackedUnionType>(type);
88 }
89
90 /// Get the value domain of this type.
91 Domain getDomain() const;
92
93 /// Get the size of this type in bits.
94 ///
95 /// Returns `None` if any of the type's dimensions is unsized, associative, or
96 /// a queue, or the core type itself has no known size.
97 std::optional<unsigned> getBitSize() const;
98
99 // Support parsing and printing of unpacked types in their prefix-stripped
100 // form.
101 static Type parse(mlir::AsmParser &odsParser);
102 void print(mlir::AsmPrinter &odsPrinter) const;
103
104protected:
105 using Type::Type;
106};
107
108//===----------------------------------------------------------------------===//
109// Packed Type
110//===----------------------------------------------------------------------===//
111
112/// A packed SystemVerilog type.
113///
114/// Packed types are the core types of SystemVerilog. They combine a core packed
115/// type with an optional sign and zero or more packed dimensions. The core
116/// packed types are:
117///
118/// - Integer vector types: `bit`, `logic`, `reg`
119/// - Integer atom types: `byte`, `shortint`, `int`, `longint`, `integer`,
120/// `time`
121/// - Packed structs and unions
122/// - Enums
123/// - Packed named types
124/// - Packed type references
125///
126/// The packed dimensions can be:
127///
128/// - Unsized (`[]`)
129/// - Ranges (`[x:y]`)
130///
131/// Note that every packed type is also a valid unpacked type. But unpacked
132/// types are *not* valid packed types.
133class PackedType : public UnpackedType {
134public:
135 static bool classof(Type type) {
136 return llvm::isa<VoidType, IntType, ArrayType, OpenArrayType, StructType,
137 UnionType>(type);
138 }
139
140 /// Get the value domain of this type.
141 Domain getDomain() const;
142
143 /// Get the size of this type in bits.
144 ///
145 /// Returns `None` if any of the type's dimensions is unsized.
146 std::optional<unsigned> getBitSize() const;
147
148protected:
149 using UnpackedType::UnpackedType;
150};
151
152//===----------------------------------------------------------------------===//
153// Struct Members
154//===----------------------------------------------------------------------===//
155
156/// A member of a struct.
158 /// The name of this member.
159 StringAttr name;
160 /// The type of this member.
162
163 bool operator==(const StructLikeMember &other) const {
164 return name == other.name && type == other.type;
165 }
166};
167
168// NOLINTNEXTLINE(readability-identifier-naming)
169inline llvm::hash_code hash_value(const StructLikeMember &x) {
170 return llvm::hash_combine(x.name, x.type);
171}
172
173} // namespace moore
174} // namespace circt
175
176// Include generated types.
177#define GET_TYPEDEF_CLASSES
178#include "circt/Dialect/Moore/MooreTypes.h.inc"
179
180#endif // CIRCT_DIALECT_MOORE_MOORETYPES_H
A packed SystemVerilog type.
Definition MooreTypes.h:133
std::optional< unsigned > getBitSize() const
Get the size of this type in bits.
Domain getDomain() const
Get the value domain of this type.
static bool classof(Type type)
Definition MooreTypes.h:135
An unpacked SystemVerilog type.
Definition MooreTypes.h:82
std::optional< unsigned > getBitSize() const
Get the size of this type in bits.
Domain getDomain() const
Get the value domain of this type.
static bool classof(Type type)
Definition MooreTypes.h:84
static Type parse(mlir::AsmParser &odsParser)
void print(mlir::AsmPrinter &odsPrinter) const
llvm::hash_code hash_value(const StructLikeMember &x)
Definition MooreTypes.h:169
Domain
The number of values each bit of a type can assume.
Definition MooreTypes.h:47
@ FourValued
Four-valued types such as logic or integer.
@ TwoValued
Two-valued types such as bit or int.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
A member of a struct.
Definition MooreTypes.h:157
UnpackedType type
The type of this member.
Definition MooreTypes.h:161
StringAttr name
The name of this member.
Definition MooreTypes.h:159
bool operator==(const StructLikeMember &other) const
Definition MooreTypes.h:163