// 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 // 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}} )