| // Copyright 2026 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // specls prints the expanded API from the SIMD spec package. | |
| package main | |
| import ( | |
| "flag" | |
| "fmt" | |
| "go/ast" | |
| "log" | |
| "os" | |
| "regexp" | |
| "simd/archsimd/_gen/specgen" | |
| ) | |
| var ( | |
| flagFilter = flag.String("f", "", "only process spec functions matching `regexp`") | |
| flagTrace = flag.Bool("trace", false, "trace solver steps") | |
| ) | |
| func main() { | |
| flag.Usage = func() { | |
| w := flag.CommandLine.Output() | |
| fmt.Fprintf(w, "usage: specls [flags] [spec dir]\n") | |
| flag.CommandLine.PrintDefaults() | |
| } | |
| flag.Parse() | |
| var specDir string | |
| switch flag.NArg() { | |
| case 0: | |
| specDir = specgen.MustFindSpecDir("") | |
| case 1: | |
| specDir = flag.Arg(0) | |
| default: | |
| flag.Usage() | |
| os.Exit(1) | |
| } | |
| var opts specgen.LoadOptions | |
| if *flagFilter != "" { | |
| re, err := regexp.Compile(*flagFilter) | |
| if err != nil { | |
| log.Fatal("invalid -f: ", err) | |
| } | |
| opts.Filter = func(fd *ast.FuncDecl) bool { | |
| return re.MatchString(fd.Name.Name) | |
| } | |
| } | |
| if *flagTrace { | |
| opts.Trace = os.Stderr | |
| } | |
| funcs, err := specgen.Load(specDir, &opts) | |
| if err != nil { | |
| fmt.Fprintf(os.Stderr, "%s\n\n", err.Error()) | |
| defer os.Exit(1) | |
| } | |
| for _, fn := range funcs { | |
| fmt.Print(fn.Decl()) | |
| fmt.Println() | |
| } | |
| } |