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