blob: 987fcd0627f3ac38daf44e39d3d162a0b38ecd4f [file] [log] [blame]
// 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}}
)