blob: ddd9f27149bfcb755a0d743282e0ea9bcce9ac60 [file]
// 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.
// Specstats reports progress on the internal/spec transition described in
// SPEC-TRANSITION.md. The checked-in output is archsimd/_gen/SPEC-STATS.txt:
//
// go run ./cmd/specstats -w
//
// Every figure it prints is a fraction heading for 100% or a defect count
// heading for zero, tied to the tasks that move it. Anything that is merely
// interesting, rather than a measure of how far along we are, does not belong
// here.
//
// # How it is put together
//
// Almost every figure in the report is the same operation: count the distinct
// things at some granularity, and count how many of them are done. So the
// program builds one fact table -- [fact], a declaration as seen in one build
// configuration -- and everything downstream is a pivot over it: pick a grain
// ([fact.declKey], [fact.triple], [fact.pair], name), pick a predicate, and
// optionally group by a dimension. [tally] does the counting and [pivot] does
// the grouping, so a new figure is a few lines rather than a new loop.
//
// Like Fill, this parses rather than type-checks, so it sees every target's
// declarations regardless of build tags (SPEC-TRANSITION.md ยง2.4). It is a
// measurement tool and not a checker: it reports divergence and does not judge
// it. fill builds the checker, and should absorb the comparison half of this
// program rather than leave two implementations to drift.
package main
import (
"flag"
"log"
"path/filepath"
"simd/archsimd/_gen/gentools"
"simd/archsimd/_gen/specgen"
)
func main() {
log.SetFlags(0)
log.SetPrefix("specstats: ")
genOpts := gentools.RegisterFlags(nil)
flag.Parse()
specDir := specgen.MustFindSpecDir(genOpts.GOROOT)
simdDir := filepath.Clean(filepath.Join(specDir, "..", ".."))
genDir := filepath.Join(simdDir, "archsimd", "_gen")
spec, err := specgen.Load(specDir, nil)
if err != nil {
log.Fatalf("loading spec: %s", err)
}
var files gentools.Files
defer files.FlushOrExit()
buf := files.NewRawFile("simd/archsimd/_gen/SPEC-STATS.txt")
measure(loadAPI(genOpts, simdDir), spec, genDir).report(buf)
}