| // 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. | |
| // Generated by {{GenerateArguments}} | |
| // Do not modify this file directly. | |
| package schema | |
| // Opcode holds information about a specific SPIR-V opcode. | |
| type Opcode struct { | |
| Opname string | |
| Class string | |
| Opcode int | |
| Operands []Operand | |
| } | |
| // Operand contains information about a logical operand for an instruction. | |
| type Operand struct { | |
| Kind *OperandKind | |
| Name string | |
| Quantifier Quantifier | |
| } | |
| // OperandKind contains information about a specific operand kind. | |
| type OperandKind struct { | |
| Category OperandCategory | |
| Kind string | |
| Enumerants []Enumerant | |
| Bases []*OperandKind | |
| } | |
| // Enumerant contains information about an enumerant in an enum. | |
| type Enumerant struct { | |
| Enumerant string | |
| Value interface{} | |
| Capabilities []string | |
| Parameters []Parameter | |
| Version string | |
| } | |
| // Parameter contains information about a logical parameter for an enumerant. | |
| type Parameter struct { | |
| Kind *OperandKind | |
| Name string | |
| } | |
| // 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 = "*" | |
| ) | |
| // OperandCategory is an enumerator that groups operand kinds. | |
| type OperandCategory string | |
| const ( | |
| // OperandCategoryBitEnum describes an operand kind where its value is a | |
| // mask, which is formed by combining the bits specified as enumerants in an | |
| // enum. | |
| OperandCategoryBitEnum = "BitEnum" | |
| // OperandCategoryValueEnum describes an operand kind where its value is an | |
| // enumerant from an enum. | |
| OperandCategoryValueEnum = "ValueEnum" | |
| // OperandCategoryID describes and operand kind where its value is an <id> | |
| // definition or reference. | |
| OperandCategoryID = "Id" | |
| // OperandCategoryLiteral describes and operand kind where its value is an | |
| // literal number or string. | |
| OperandCategoryLiteral = "Literal" | |
| // OperandCategoryComposite describes and operand kind where its value is | |
| // composed from operand values from the above categories. | |
| OperandCategoryComposite = "Composite" | |
| ) | |
| // OpcodeMap is a map of opcode name to Opcode type. | |
| type OpcodeMap map[string]*Opcode | |
| var ( | |
| // Opcodes is a map of opcode name to Opcode description. | |
| Opcodes = OpcodeMap {•{{range $i := .SPIRV.Instructions}} | |
| "{{$i.Opname}}": {{Title $i.Opname}},{{end}} | |
| } | |
| // ExtOpcodes is a map of extension name to Opcode description list. | |
| ExtOpcodes = map[string]OpcodeMap {•{{range $ext := .Extensions}} | |
| "{{$ext.Name}}": {•{{range $i := $ext.Instructions}} | |
| "{{$i.Opname}}": {{Global $ext.Name}}_{{$i.Opname}},{{end}} | |
| },{{end}} | |
| } | |
| {{range $i := .SPIRV.Instructions}} {{Title $i.Opname}} = &Opcode { | |
| Opname: "{{$i.Opname}}", | |
| Class: "{{$i.Class}}", | |
| Opcode: {{$i.Opcode}}, | |
| Operands: []Operand {•{{range $i := $i.Operands}} | |
| Operand { | |
| Kind: OperandKind{{$i.Kind}}, | |
| Name: "{{Replace $i.Name "\n" " "}}", | |
| Quantifier: "{{$i.Quantifier}}", | |
| }, {{end}} | |
| }, | |
| } | |
| {{end}} | |
| {{range $ext := .Extensions}}{{range $i := $ext.Instructions}} {{Global $ext.Name}}_{{$i.Opname}} = &Opcode { | |
| Opname: "{{$i.Opname}}", | |
| Operands: []Operand {•{{range $i := $i.Operands}} | |
| Operand { | |
| Kind: OperandKind{{$i.Kind}}, | |
| Name: "{{Replace $i.Name "\n" " "}}", | |
| Quantifier: "{{$i.Quantifier}}", | |
| }, {{end}} | |
| }, | |
| } | |
| {{end}}{{end}} | |
| {{range $o := .All.OperandKinds}} OperandKind{{$o.Kind}} = &OperandKind { | |
| Kind: "{{$o.Kind}}", | |
| Category: "{{$o.Category}}", | |
| Enumerants: []Enumerant {•{{range $e := $o.Enumerants}} | |
| Enumerant{ | |
| Enumerant: "{{$e.Enumerant}}", | |
| Value: {{$e.Value}}, | |
| Capabilities: []string{•{{range $c := $e.Capabilities}}"{{$c}}",{{end}}•}, | |
| Parameters: []Parameter{•{{range $p := $e.Parameters}}{•OperandKind{{$p.Kind}}, "{{$p.Name}}"•},{{end}}•}, | |
| Version: "{{$e.Version}}", | |
| },{{end}} | |
| }, | |
| Bases: []*OperandKind {•{{range $b := $o.Bases}}OperandKind{{$b}},{{end}}•}, | |
| } | |
| {{end}} | |
| ) |