1
2
3
4
5
6 package main
7
8 import (
9 "flag"
10 "fmt"
11 "go/ast"
12 "log"
13 "os"
14 "regexp"
15 "simd/archsimd/_gen/specgen"
16 )
17
18 var (
19 flagFilter = flag.String("f", "", "only process spec functions matching `regexp`")
20 flagTrace = flag.Bool("trace", false, "trace solver steps")
21 )
22
23 func main() {
24 flag.Usage = func() {
25 w := flag.CommandLine.Output()
26 fmt.Fprintf(w, "usage: specls [flags] [spec dir]\n")
27 flag.CommandLine.PrintDefaults()
28 }
29
30 flag.Parse()
31 var specDir string
32 switch flag.NArg() {
33 case 0:
34 specDir = specgen.MustFindSpecDir()
35 case 1:
36 specDir = flag.Arg(0)
37 default:
38 flag.Usage()
39 os.Exit(1)
40 }
41
42 var opts specgen.LoadOptions
43 if *flagFilter != "" {
44 re, err := regexp.Compile(*flagFilter)
45 if err != nil {
46 log.Fatal("invalid -f: ", err)
47 }
48 opts.Filter = func(fd *ast.FuncDecl) bool {
49 return re.MatchString(fd.Name.Name)
50 }
51 }
52 if *flagTrace {
53 opts.Trace = os.Stderr
54 }
55
56 funcs, err := specgen.Load(specDir, &opts)
57 if err != nil {
58 fmt.Fprintf(os.Stderr, "%s\n\n", err.Error())
59 defer os.Exit(1)
60 }
61
62 for _, fn := range funcs {
63 fmt.Print(fn.Decl())
64 fmt.Println()
65 }
66 }
67
View as plain text