| // Copyright (C) 2019 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // Package grammar holds the JSON type definitions for the SPIR-V grammar schema. |
| // |
| // See https://www.khronos.org/registry/spir-v/specs/unified1/MachineReadableGrammar.html |
| // for more information. |
| package grammar |
| |
| // Root is the top-level structure of the JSON grammar. |
| type Root struct { |
| MagicNumber string `json:"magic_number"` |
| MajorVersion int `json:"major_version"` |
| MinorVersion int `json:"minor_version"` |
| Revision int `json:"revision"` |
| Instructions []Instruction `json:"instructions"` |
| OperandKinds []OperandKind `json:"operand_kinds"` |
| } |
| |
| // Instruction holds information about a specific SPIR-V instruction. |
| type Instruction struct { |
| Opname string `json:"opname"` |
| Class string `json:"class"` |
| Opcode int `json:"opcode"` |
| Operands []Operand `json:"operands"` |
| } |
| |
| // Operand contains information about a logical operand for an instruction. |
| type Operand struct { |
| Kind string `json:"kind"` |
| Name string `json:"name"` |
| Quantifier Quantifier `json:"quantifier"` |
| } |
| |
| // OperandKind contains information about a specific operand kind. |
| type OperandKind struct { |
| Category string `json:"category"` |
| Kind string `json:"kind"` |
| Enumerants []Enumerant `json:"enumerants"` |
| Bases []string `json:"bases"` |
| } |
| |
| // Enumerant contains information about an enumerant in an enum. |
| type Enumerant struct { |
| Enumerant string `json:"enumerant"` |
| Value interface{} `json:"value"` |
| Capabilities []string `json:"capabilities"` |
| Parameters []Parameter `json:"parameters"` |
| Version string `json:"version"` |
| } |
| |
| // Parameter contains information about a logical parameter for an enumerant. |
| type Parameter struct { |
| Kind string `json:"kind"` |
| Name string `json:"name"` |
| } |
| |
| // Quantifier indicates the number of times the quantified term may appear. |
| type Quantifier string |
| |
| const ( |
| // Once indicates the quantified term may appear exactly once. |
| Once Quantifier = "" |
| // ZeroOrOnce indicates the quantified term may appear zero or one |
| // time; an optional term. |
| ZeroOrOnce Quantifier = "?" |
| // ZeroOrMany indicates the quantified term may appear any number of |
| // times. |
| ZeroOrMany Quantifier = "*" |
| ) |