From 633bfd463346699b26a391cd8f8ff046181a09d8 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Fri, 22 Sep 2023 16:00:32 -0500 Subject: [PATCH 01/10] Temporarily commit replacement parseTest.py for parseHPMC.py. --- bin/parseTest.py | 385 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 385 insertions(+) create mode 100755 bin/parseTest.py diff --git a/bin/parseTest.py b/bin/parseTest.py new file mode 100755 index 000000000..99bcd3fa1 --- /dev/null +++ b/bin/parseTest.py @@ -0,0 +1,385 @@ +#!/usr/bin/python3 + +########################################### +## Written: Rose Thompson ross1728@gmail.com +## Created: 20 September 2023 +## Modified: +## +## Purpose: Parses the performance counters from a modelsim trace. +## +## A component of the CORE-V-WALLY configurable RISC-V project. +## +## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University +## +## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +## +## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file +## except in compliance with the License, or, at your option, the Apache License version 2.0. You +## may obtain a copy of the License at +## +## https:##solderpad.org/licenses/SHL-2.1/ +## +## Unless required by applicable law or agreed to in writing, any work 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. +################################################################################################ + +import os +import sys +import matplotlib.pyplot as plt +import math + +import argparse + + +def ParseBranchListFile(path): + '''Take the path to the list of Questa Sim log files containing the performance counters outputs. File + is formated in row columns. Each row is a trace with the file, branch predictor type, and the parameters. + parameters can be any number and depend on the predictor type. Returns a list of lists.''' + lst = [] + BranchList = open(path, 'r') + for line in BranchList: + tokens = line.split() + predictorLog = os.path.dirname(path) + '/' + tokens[0] + predictorType = tokens[1] + predictorParams = tokens[2::] + lst.append([predictorLog, predictorType, predictorParams]) + #print(predictorLog, predictorType, predictorParams) + return lst + +def ProcessFile(fileName): + '''Extract preformance counters from a modelsim log. Outputs a list of tuples for each test/benchmark. + The tuple contains the test name, optimization characteristics, and dictionary of performance counters.''' + # 1 find lines with Read memfile and extract test name + # 2 parse counters into a list of (name, value) tuples (dictionary maybe?) + benchmarks = [] + transcript = open(fileName, 'r') + HPMClist = { } + testName = '' + for line in transcript.readlines(): + lineToken = line.split() + if(len(lineToken) > 3 and lineToken[1] == 'Read' and lineToken[2] == 'memfile'): + opt = lineToken[3].split('/')[-4] + testName = lineToken[3].split('/')[-1].split('.')[0] + HPMClist = { } + elif(len(lineToken) > 4 and lineToken[1][0:3] == 'Cnt'): + countToken = line.split('=')[1].split() + value = int(countToken[0]) + name = ' '.join(countToken[1:]) + HPMClist[name] = value + elif ('is done' in line): + benchmarks.append((testName, opt, HPMClist)) + return benchmarks + + +def ComputeStats(benchmarks): + for benchmark in benchmarks: + (nameString, opt, dataDict) = benchmark + dataDict['CPI'] = 1.0 * int(dataDict['Mcycle']) / int(dataDict['InstRet']) + dataDict['BDMR'] = 100.0 * int(dataDict['BP Dir Wrong']) / int(dataDict['Br Count']) + dataDict['BTMR'] = 100.0 * int(dataDict['BP Target Wrong']) / (int(dataDict['Br Count']) + int(dataDict['Jump Not Return'])) + dataDict['RASMPR'] = 100.0 * int(dataDict['RAS Wrong']) / int(dataDict['Return']) + dataDict['ClassMPR'] = 100.0 * int(dataDict['Instr Class Wrong']) / int(dataDict['InstRet']) + dataDict['ICacheMR'] = 100.0 * int(dataDict['I Cache Miss']) / int(dataDict['I Cache Access']) + + cycles = int(dataDict['I Cache Miss']) + if(cycles == 0): ICacheMR = 0 + else: ICacheMR = 100.0 * int(dataDict['I Cache Cycles']) / cycles + dataDict['ICacheMT'] = ICacheMR + + dataDict['DCacheMR'] = 100.0 * int(dataDict['D Cache Miss']) / int(dataDict['D Cache Access']) + + (nameString, opt, dataDict) = benchmark + cycles = int(dataDict['D Cache Miss']) + if(cycles == 0): DCacheMR = 0 + else: DCacheMR = 100.0 * int(dataDict['D Cache Cycles']) / cycles + dataDict['DCacheMT'] = DCacheMR + + +def ComputeGeometricAverage(benchmarks): + fields = ['BDMR', 'BTMR', 'RASMPR', 'ClassMPR', 'ICacheMR', 'DCacheMR', 'CPI', 'ICacheMT', 'DCacheMT'] + AllAve = {} + for field in fields: + Product = 1 + index = 0 + for (testName, opt, HPMCList) in benchmarks: + #print(HPMCList) + Product *= HPMCList[field] + index += 1 + AllAve[field] = Product ** (1.0/index) + benchmarks.append(('Mean', '', AllAve)) + +def GenerateName(predictorType, predictorParams): + if(predictorType == 'gshare' or predictorType == 'twobit'): + return predictorType + predictorParams[0] + elif(predictorParams == 'local'): + return predictorType + predictorParams[0] + '_' + predictorParams[1] + else: + print(f'Error unsupported predictor type {predictorType}') + sys.exit(-1) + +def ComputePredNumEntries(predictorType, predictorParams): + if(predictorType == 'gshare' or predictorType == 'twobit'): + return 2**int(predictorParams[0]) + elif(predictorParams == 'local'): + return 2**int(predictorParams[0]) * int(predictorParams[1]) + 2**int(predictorParams[1]) + else: + print(f'Error unsupported predictor type {predictorType}') + sys.exit(-1) + +def BuildDataBase(predictorLogs): + # Once done with the following loop, performanceCounterList will contain the predictor type and size along with the + # raw performance counter data and the processed data on a per benchmark basis. It also includes the geometric mean. + # list + # branch predictor configuration 0 (tuple) + # benchmark name + # compiler optimization + # data (dictionary) + # dictionary of performance counters + # branch predictor configuration 1 (tuple) + # benchmark name (dictionary) + # compiler optimization + # data + # dictionary of performance counters + # ... + performanceCounterList = [] + for trace in predictorLogs: + predictorLog = trace[0] + predictorType = trace[1] + predictorParams = trace[2] + # Extract the performance counter data + performanceCounters = ProcessFile(predictorLog) + ComputeStats(performanceCounters) + ComputeGeometricAverage(performanceCounters) + #print(performanceCounters) + performanceCounterList.append([GenerateName(predictorType, predictorParams), predictorType, performanceCounters, ComputePredNumEntries(predictorType, predictorParams)]) + return performanceCounterList + +def ReorderDataBase(performanceCounterList): + # Reorder the data so the benchmark name comes first, then the branch predictor configuration + benchmarkFirstList = [] + for (predictorName, predictorPrefixName, benchmarks, entries) in performanceCounterList: + for benchmark in benchmarks: + (nameString, opt, dataDict) = benchmark + benchmarkFirstList.append((nameString, opt, predictorName, predictorPrefixName, entries, dataDict)) + return benchmarkFirstList + +def ExtractSelectedData(benchmarkFirstList): + # now extract all branch prediction direction miss rates for each + # namestring + opt, config + benchmarkDict = { } + for benchmark in benchmarkFirstList: + (name, opt, config, prefixName, entries, dataDict) = benchmark + if opt == 'bd_speedopt_speed': NewName = name+'Sp' + elif opt == 'bd_sizeopt_speed': NewName = name+'Sz' + else: NewName = name + #print(NewName) + #NewName = name+'_'+opt + if NewName in benchmarkDict: + benchmarkDict[NewName].append((config, prefixName, entries, dataDict[ReportPredictorType])) + else: + benchmarkDict[NewName] = [(config, prefixName, entries, dataDict[ReportPredictorType])] + return benchmarkDict + +def ReportAsTable(benchmarkDict): + refLine = benchmarkDict['Mean'] + FirstLine = [] + SecondLine = [] + for (name, typ, size, val) in refLine: + FirstLine.append(name) + SecondLine.append(size) + + sys.stdout.write('benchmark\t\t') + for name in FirstLine: + if(len(name) < 8): sys.stdout.write('%s\t\t' % name) + else: sys.stdout.write('%s\t' % name) + sys.stdout.write('\n') + sys.stdout.write('size\t\t\t') + for size in SecondLine: + if(len(str(size)) < 8): sys.stdout.write('%d\t\t' % size) + else: sys.stdout.write('%d\t' % size) + sys.stdout.write('\n') + + if(args.summary): + sys.stdout.write('Mean\t\t\t') + for (name, typ, size, val) in refLine: + sys.stdout.write('%0.2f\t\t' % (val if not args.invert else 100 - val)) + sys.stdout.write('\n') + + if(not args.summary): + for benchmark in benchmarkDict: + length = len(benchmark) + if(length < 8): sys.stdout.write('%s\t\t\t' % benchmark) + elif(length < 16): sys.stdout.write('%s\t\t' % benchmark) + else: sys.stdout.write('%s\t' % benchmark) + for (name, typ, size, val) in benchmarkDict[benchmark]: + sys.stdout.write('%0.2f\t\t' % (val if not args.invert else 100 -val)) + sys.stdout.write('\n') + +def ReportAsText(benchmarkDict): + if(args.summary): + mean = benchmarkDict['Mean'] + print('Mean') + for (name, typ, size, val) in mean: + sys.stdout.write('%s %s %0.2f\n' % (name, size, val if not args.invert else 100 - val)) + + if(not args.summary): + for benchmark in benchmarkDict: + print(benchmark) + for (name, type, size, val) in benchmarkDict[benchmark]: + sys.stdout.write('%s %s %0.2f\n' % (name, size, val if not args.invert else 100 - val)) + +def ReportAsGraph(benchmarkDict, bar): + def FormatToPlot(currBenchmark): + names = [] + sizes = [] + values = [] + typs = [] + for config in currBenchmark: + names.append(config[0]) + sizes.append(config[1]) + values.append(config[2]) + typs.append(config[3]) + return (names, sizes, values, typs) + titlesInvert = {'BDMR' : 'Branch Direction Accuracy', + 'BTMR' : 'Branch Target Accuracy', + 'RASMPR': 'RAS Accuracy', + 'ClassMPR': 'Class Prediction Accuracy'} + titles = {'BDMR' : 'Branch Direction Misprediction', + 'BTMR' : 'Branch Target Misprediction', + 'RASMPR': 'RAS Misprediction', + 'ClassMPR': 'Class Misprediction'} + if(args.summary): + markers = ['x', '.', '+', '*', '^', 'o', ',', 's'] + colors = ['black', 'blue', 'dodgerblue', 'turquoise', 'lightsteelblue', 'gray', 'black', 'blue'] + temp = benchmarkDict['Mean'] + + # the benchmarkDict['Mean'] contains sequencies of results for multiple + # branch predictors with various parameterizations + # group the parameterizations by the common typ. + sequencies = {} + for (name, typ, size, value) in benchmarkDict['Mean']: + if not typ in sequencies: + sequencies[typ] = [(size, value)] + else: + sequencies[typ].append((size,value)) + # then graph the common typ as a single line+scatter plot + # finally repeat for all typs of branch predictors and overlay + fig, axes = plt.subplots() + index = 0 + if(args.invert): plt.title(titlesInvert[ReportPredictorType]) + else: plt.title(titles[ReportPredictorType]) + for branchPredName in sequencies: + data = sequencies[branchPredName] + (xdata, ydata) = zip(*data) + if args.invert: ydata = [100 - x for x in ydata] + axes.plot(xdata, ydata, color=colors[index]) + axes.scatter(xdata, ydata, label=branchPredName, color=colors[index], marker=markers[index]) + index = (index + 1) % len(markers) + axes.legend(loc='upper left') + axes.set_xscale("log") + axes.set_ylabel('Prediction Accuracy') + axes.set_xlabel('Entries') + axes.set_xticks(xdata) + axes.set_xticklabels(xdata) + axes.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) + + if(not args.summary): + size = len(benchmarkDict) + sizeSqrt = math.sqrt(size) + isSquare = math.isclose(sizeSqrt, round(sizeSqrt)) + numCol = math.floor(sizeSqrt) + numRow = numCol + (0 if isSquare else 1) + index = 1 + fig = plt.figure() + for benchmarkName in benchmarkDict: + currBenchmark = benchmarkDict[benchmarkName] + (names, typs, sizes, values) = FormatToPlot(currBenchmark) + #axes.plot(numRow, numCol, index) + ax = fig.add_subplot(numRow, numCol, index) + ax.bar(names, values) + ax.title.set_text(benchmarkName) + #plt.ylabel('BR Dir Miss Rate (%)') + #plt.xlabel('Predictor') + index += 1 + plt.show() + + +# main +parser = argparse.ArgumentParser(description='Parses performance counters from a Questa Sim trace to produce a graph or graphs.') + +# parse program arguments +metric = parser.add_mutually_exclusive_group() +metric.add_argument('-r', '--ras', action='store_const', help='Plot return address stack (RAS) performance.', default=False, const=True) +metric.add_argument('-d', '--direction', action='store_const', help='Plot direction prediction (2-bit, Gshare, local, etc) performance.', default=False, const=True) +metric.add_argument('-t', '--target', action='store_const', help='Plot branch target buffer (BTB) performance.', default=False, const=True) +metric.add_argument('-c', '--iclass', action='store_const', help='Plot instruction classification performance.', default=False, const=True) + +parser.add_argument('-s', '--summary', action='store_const', help='Show only the geometric average for all benchmarks.', default=False, const=True) +parser.add_argument('-b', '--bar', action='store_const', help='Plot graphs.', default=False, const=True) +parser.add_argument('-g', '--reference', action='store_const', help='Include the golden reference model from branch-predictor-simulator. Data stored statically at the top of %(prog)s. If you need to regenreate use CModelBranchAcurracy.sh', default=False, const=True) +parser.add_argument('-i', '--invert', action='store_const', help='Invert metric. Example Branch miss prediction becomes prediction accuracy. 100 - miss rate', default=False, const=True) + +displayMode = parser.add_mutually_exclusive_group() +displayMode.add_argument('--text', action='store_const', help='Display in text format only.', default=False, const=True) +displayMode.add_argument('--table', action='store_const', help='Display in text format only.', default=False, const=True) +displayMode.add_argument('--gui', action='store_const', help='Display in text format only.', default=False, const=True) +displayMode.add_argument('--debug', action='store_const', help='Display in text format only.', default=False, const=True) +parser.add_argument('sources', nargs=1) + +args = parser.parse_args() + +# Figure what we are reporting +ReportPredictorType = 'BDMR' # default +if(args.ras): ReportPredictorType = 'RASMPR' +if(args.target): ReportPredictorType = 'BTMR' +if(args.iclass): ReportPredictorType = 'ClassMPR' + +# Figure how we are displaying the data +ReportMode = 'gui' # default +if(args.text): ReportMode = 'text' +if(args.table): ReportMode = 'table' +if(args.debug): ReportMode = 'debug' + +# read the questa sim list file. +# row, col format. each row is a questa sim run with performance counters and a particular +# branch predictor type and size. size can be multiple parameters for more complex predictors like +# local history and tage. +# +predictorLogs = ParseBranchListFile(args.sources[0]) # digests the traces +performanceCounterList = BuildDataBase(predictorLogs) # builds a database of performance counters by trace and then by benchmark +benchmarkFirstList = ReorderDataBase(performanceCounterList) # reorder first by benchmark then trace +benchmarkDict = ExtractSelectedData(benchmarkFirstList) # filters to just the desired performance counter metric + +#print(benchmarkDict['Mean']) +#print(benchmarkDict['aha-mont64Speed']) +#print(benchmarkDict) + +# table format +if(ReportMode == 'table'): + ReportAsTable(benchmarkDict) + +if(ReportMode == 'text'): + ReportAsText(benchmarkDict) + +if(ReportMode == 'gui'): + ReportAsGraph(benchmarkDict, args.bar) + +# *** this is only needed of -b (no -s) + +# debug +#config0 = performanceCounterList[0][0] +#data0 = performanceCounterList[0][1] +#bench0 = data0[0] +#bench0name = bench0[0] +#bench0data = bench0[2] +#bench0BrCount = bench0data['Br Count'] +#bench1 = data0[1] + +#print(data0) +#print(bench0) +#print(bench1) + +#print(bench0name) +#print(bench0BrCount) From 95cd882089c5ddbda7a5dea57864adb014768be8 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Sep 2023 09:55:38 -0500 Subject: [PATCH 02/10] Major improvement to the bar graph generation. --- bin/parseTest.py | 63 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/bin/parseTest.py b/bin/parseTest.py index 99bcd3fa1..966572955 100755 --- a/bin/parseTest.py +++ b/bin/parseTest.py @@ -29,7 +29,7 @@ import os import sys import matplotlib.pyplot as plt import math - +import numpy as np import argparse @@ -285,6 +285,25 @@ def ReportAsGraph(benchmarkDict, bar): axes.set_xticklabels(xdata) axes.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) + # if(not args.summary): + # size = len(benchmarkDict) + # sizeSqrt = math.sqrt(size) + # isSquare = math.isclose(sizeSqrt, round(sizeSqrt)) + # numCol = math.floor(sizeSqrt) + # numRow = numCol + (0 if isSquare else 1) + # index = 1 + # fig = plt.figure() + # for benchmarkName in benchmarkDict: + # currBenchmark = benchmarkDict[benchmarkName] + # (names, typs, sizes, values) = FormatToPlot(currBenchmark) + # #axes.plot(numRow, numCol, index) + # ax = fig.add_subplot(numRow, numCol, index) + # ax.bar(names, values) + # ax.title.set_text(benchmarkName) + # #plt.ylabel('BR Dir Miss Rate (%)') + # #plt.xlabel('Predictor') + # index += 1 + if(not args.summary): size = len(benchmarkDict) sizeSqrt = math.sqrt(size) @@ -292,17 +311,43 @@ def ReportAsGraph(benchmarkDict, bar): numCol = math.floor(sizeSqrt) numRow = numCol + (0 if isSquare else 1) index = 1 - fig = plt.figure() + fig = plt.subplots() + testLimit = 7 + + xlabelList = [] + seriesDict = {} + NumberInGroup = len(benchmarkDict['Mean']) + # Figure out width of bars. NumberInGroup bars + want 2 bar space + # the space between groups is 1 + EffectiveNumInGroup = NumberInGroup + 2 + barWidth = 1 / EffectiveNumInGroup for benchmarkName in benchmarkDict: currBenchmark = benchmarkDict[benchmarkName] - (names, typs, sizes, values) = FormatToPlot(currBenchmark) - #axes.plot(numRow, numCol, index) - ax = fig.add_subplot(numRow, numCol, index) - ax.bar(names, values) - ax.title.set_text(benchmarkName) - #plt.ylabel('BR Dir Miss Rate (%)') - #plt.xlabel('Predictor') + xlabelList.append(benchmarkName) + for (name, typ, size, value) in currBenchmark: + if(name not in seriesDict): + seriesDict[name] = [value] + else: + seriesDict[name].append(value) + #print(currBenchmark) + #(names, typs, sizes, values) = FormatToPlot(currBenchmark) + #xpos = np.arange(testLimit + index*barWidth) + #print(f'xpos = {xpos}, values={values}') + #plt.bar(xpos, values, wdith=barWidth, edgecolor='grey', label=names) + if(index >= testLimit): break index += 1 + print(f'xlabelList = {xlabelList}') + print(f'seriesDict = {seriesDict}') + index = 0 + for name in seriesDict: + xpos = np.arange(testLimit) + xpos = [x + index*barWidth for x in xpos] + values = seriesDict[name] + print(f'xpos = {xpos}, values={values}') + plt.bar(xpos, values, width=barWidth, edgecolor='grey', label=name) + index += 1 + plt.xticks([r + barWidth*(NumberInGroup/2-0.5) for r in range(0, testLimit)], xlabelList) + plt.legend() plt.show() From ff46fa7d603d2158c37ab7af56d6e3b5844eb892 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Sep 2023 10:09:33 -0500 Subject: [PATCH 03/10] Now produces beautiful graphs. --- bin/parseTest.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bin/parseTest.py b/bin/parseTest.py index 966572955..5cdcd81d4 100755 --- a/bin/parseTest.py +++ b/bin/parseTest.py @@ -321,6 +321,7 @@ def ReportAsGraph(benchmarkDict, bar): # the space between groups is 1 EffectiveNumInGroup = NumberInGroup + 2 barWidth = 1 / EffectiveNumInGroup + colors = ['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'black', 'black', 'black', 'black', 'black', 'black'] for benchmarkName in benchmarkDict: currBenchmark = benchmarkDict[benchmarkName] xlabelList.append(benchmarkName) @@ -344,10 +345,13 @@ def ReportAsGraph(benchmarkDict, bar): xpos = [x + index*barWidth for x in xpos] values = seriesDict[name] print(f'xpos = {xpos}, values={values}') - plt.bar(xpos, values, width=barWidth, edgecolor='grey', label=name) + plt.bar(xpos, values, width=barWidth, edgecolor='grey', label=name, color=colors[index%len(colors)]) index += 1 plt.xticks([r + barWidth*(NumberInGroup/2-0.5) for r in range(0, testLimit)], xlabelList) - plt.legend() + plt.xlabel('Benchmark') + if(not args.invert): plt.ylabel('Misprediction Rate Accuracy (%)') + else: plt.ylabel('Prediction Accuracy (%)') + plt.legend(loc='upper left', ncol=2) plt.show() From 469b096bd624768cacffd582df7038ea2baa9fa0 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Sep 2023 12:45:09 -0500 Subject: [PATCH 04/10] Finally have this script generating beautiful bar plots of branch predictor misrates. --- bin/parseTest.py | 88 +++++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 30 deletions(-) diff --git a/bin/parseTest.py b/bin/parseTest.py index 5cdcd81d4..ba3309aff 100755 --- a/bin/parseTest.py +++ b/bin/parseTest.py @@ -230,6 +230,40 @@ def ReportAsText(benchmarkDict): for (name, type, size, val) in benchmarkDict[benchmark]: sys.stdout.write('%s %s %0.2f\n' % (name, size, val if not args.invert else 100 - val)) +def Inversion(lst): + return [x if not args.invert else 100 - x for x in lst] + +def BarGraph(seriesDict, xlabelList, BenchPerRow, FileName): + index = 0 + NumberInGroup = len(seriesDict) + # Figure out width of bars. NumberInGroup bars + want 2 bar space + # the space between groups is 1 + EffectiveNumInGroup = NumberInGroup + 2 + barWidth = 1 / EffectiveNumInGroup + fig = plt.subplots(figsize = (EffectiveNumInGroup*BenchPerRow/8, 4)) + colors = ['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'black', 'black', 'black', 'black', 'black', 'black'] + for name in seriesDict: + xpos = np.arange(BenchPerRow) + xpos = [x + index*barWidth for x in xpos] + values = seriesDict[name] + plt.bar(xpos, Inversion(values), width=barWidth, edgecolor='grey', label=name, color=colors[index%len(colors)]) + index += 1 + plt.xticks([r + barWidth*(NumberInGroup/2-0.5) for r in range(0, BenchPerRow)], xlabelList) + plt.xlabel('Benchmark') + if(not args.invert): plt.ylabel('Misprediction Rate (%)') + else: plt.ylabel('Prediction Accuracy (%)') + plt.legend(loc='upper left', ncol=2) + plt.savefig(FileName) + +def SelectPartition(xlabelListBig, seriesDictBig, group, BenchPerRow): + seriesDictTrunk = {} + for benchmarkName in seriesDictBig: + lst = seriesDictBig[benchmarkName] + seriesDictTrunk[benchmarkName] = lst[group*BenchPerRow:(group+1)*BenchPerRow] + xlabelListTrunk = xlabelListBig[group*BenchPerRow:(group+1)*BenchPerRow] + return(xlabelListTrunk, seriesDictTrunk) + + def ReportAsGraph(benchmarkDict, bar): def FormatToPlot(currBenchmark): names = [] @@ -284,6 +318,8 @@ def ReportAsGraph(benchmarkDict, bar): axes.set_xticks(xdata) axes.set_xticklabels(xdata) axes.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) + plt.show() + # if(not args.summary): # size = len(benchmarkDict) @@ -311,17 +347,11 @@ def ReportAsGraph(benchmarkDict, bar): numCol = math.floor(sizeSqrt) numRow = numCol + (0 if isSquare else 1) index = 1 - fig = plt.subplots() - testLimit = 7 + BenchPerRow = 7 xlabelList = [] seriesDict = {} - NumberInGroup = len(benchmarkDict['Mean']) - # Figure out width of bars. NumberInGroup bars + want 2 bar space - # the space between groups is 1 - EffectiveNumInGroup = NumberInGroup + 2 - barWidth = 1 / EffectiveNumInGroup - colors = ['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'black', 'black', 'black', 'black', 'black', 'black'] + for benchmarkName in benchmarkDict: currBenchmark = benchmarkDict[benchmarkName] xlabelList.append(benchmarkName) @@ -330,29 +360,27 @@ def ReportAsGraph(benchmarkDict, bar): seriesDict[name] = [value] else: seriesDict[name].append(value) - #print(currBenchmark) - #(names, typs, sizes, values) = FormatToPlot(currBenchmark) - #xpos = np.arange(testLimit + index*barWidth) - #print(f'xpos = {xpos}, values={values}') - #plt.bar(xpos, values, wdith=barWidth, edgecolor='grey', label=names) - if(index >= testLimit): break + if(index >= BenchPerRow): break index += 1 - print(f'xlabelList = {xlabelList}') - print(f'seriesDict = {seriesDict}') - index = 0 - for name in seriesDict: - xpos = np.arange(testLimit) - xpos = [x + index*barWidth for x in xpos] - values = seriesDict[name] - print(f'xpos = {xpos}, values={values}') - plt.bar(xpos, values, width=barWidth, edgecolor='grey', label=name, color=colors[index%len(colors)]) - index += 1 - plt.xticks([r + barWidth*(NumberInGroup/2-0.5) for r in range(0, testLimit)], xlabelList) - plt.xlabel('Benchmark') - if(not args.invert): plt.ylabel('Misprediction Rate Accuracy (%)') - else: plt.ylabel('Prediction Accuracy (%)') - plt.legend(loc='upper left', ncol=2) - plt.show() + + xlabelListBig = [] + seriesDictBig = {} + for benchmarkName in benchmarkDict: + currBenchmark = benchmarkDict[benchmarkName] + xlabelListBig.append(benchmarkName) + for (name, typ, size, value) in currBenchmark: + if(name not in seriesDictBig): + seriesDictBig[name] = [value] + else: + seriesDictBig[name].append(value) + + #The next step will be to split the benchmarkDict into length BenchPerRow pieces then repeat the following code + # on each piece. + for row in range(0, math.ceil(39 / BenchPerRow)): + (xlabelListTrunk, seriesDictTrunk) = SelectPartition(xlabelListBig, seriesDictBig, row, BenchPerRow) + FileName = 'barSegment%d.png' % row + groupLen = len(xlabelListTrunk) + BarGraph(seriesDictTrunk, xlabelListTrunk, groupLen, FileName) # main From de7c0ff786b433aaeecd6b6f11cc354dbba702f9 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Mon, 25 Sep 2023 18:16:58 -0500 Subject: [PATCH 05/10] add c++ support to buildroot's config file. this is needed for running tensorflow's benchmark. --- .../buildroot-2023.05.1/main.config | 1498 ++++------------- 1 file changed, 298 insertions(+), 1200 deletions(-) diff --git a/linux/buildroot-config-src/buildroot-2023.05.1/main.config b/linux/buildroot-config-src/buildroot-2023.05.1/main.config index c7745f443..bb0547d71 100644 --- a/linux/buildroot-config-src/buildroot-2023.05.1/main.config +++ b/linux/buildroot-config-src/buildroot-2023.05.1/main.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Buildroot 2023.05.1-dirty Configuration +# Buildroot 2023.05.2-166-gb362115b25 Configuration # BR2_HAVE_DOT_CONFIG=y BR2_HOST_GCC_AT_LEAST_4_9=y @@ -99,7 +99,7 @@ BR2_KERNEL_HEADERS_6_3=y # BR2_KERNEL_HEADERS_CUSTOM_TARBALL is not set # BR2_KERNEL_HEADERS_CUSTOM_GIT is not set BR2_KERNEL_HEADERS_LATEST=y -BR2_DEFAULT_KERNEL_HEADERS="6.3.12" +BR2_DEFAULT_KERNEL_HEADERS="6.3.13" BR2_PACKAGE_LINUX_HEADERS=y BR2_PACKAGE_MUSL_ARCH_SUPPORTS=y BR2_PACKAGE_MUSL_SUPPORTS=y @@ -133,7 +133,7 @@ BR2_BINUTILS_EXTRA_CONFIG_OPTIONS="" BR2_GCC_VERSION_12_X=y BR2_GCC_VERSION="12.3.0" BR2_EXTRA_GCC_CONFIG_OPTIONS="" -# BR2_TOOLCHAIN_BUILDROOT_CXX is not set +BR2_TOOLCHAIN_BUILDROOT_CXX=y # BR2_TOOLCHAIN_BUILDROOT_FORTRAN is not set # BR2_GCC_ENABLE_OPENMP is not set # BR2_GCC_ENABLE_GRAPHITE is not set @@ -151,6 +151,7 @@ BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS=y BR2_TOOLCHAIN_SUPPORTS_VARIADIC_MI_THUNK=y BR2_USE_WCHAR=y BR2_ENABLE_LOCALE=y +BR2_INSTALL_LIBSTDCPP=y BR2_TOOLCHAIN_HAS_THREADS=y BR2_TOOLCHAIN_HAS_THREADS_DEBUG=y BR2_TOOLCHAIN_HAS_THREADS_NPTL=y @@ -406,7 +407,7 @@ BR2_LINUX_KERNEL_LATEST_VERSION=y # BR2_LINUX_KERNEL_CUSTOM_GIT is not set # BR2_LINUX_KERNEL_CUSTOM_HG is not set # BR2_LINUX_KERNEL_CUSTOM_SVN is not set -BR2_LINUX_KERNEL_VERSION="6.3.12" +BR2_LINUX_KERNEL_VERSION="6.3.13" BR2_LINUX_KERNEL_PATCH="" # BR2_LINUX_KERNEL_USE_DEFCONFIG is not set # BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG is not set @@ -475,31 +476,19 @@ BR2_PACKAGE_SKELETON_INIT_SYSV=y # BR2_PACKAGE_BLUEZ_ALSA is not set # BR2_PACKAGE_DVBLAST is not set # BR2_PACKAGE_DVDAUTHOR is not set - -# -# dvdrw-tools needs a toolchain w/ threads, C++, wchar -# - -# -# espeak needs a toolchain w/ C++, wchar, threads, dynamic library -# +# BR2_PACKAGE_DVDRW_TOOLS is not set +# BR2_PACKAGE_ESPEAK is not set # BR2_PACKAGE_FAAD2 is not set BR2_PACKAGE_FFMPEG_ARCH_SUPPORTS=y # BR2_PACKAGE_FFMPEG is not set # BR2_PACKAGE_FLAC is not set # BR2_PACKAGE_FLITE is not set # BR2_PACKAGE_FLUID_SOUNDFONT is not set - -# -# fluidsynth needs a toolchain w/ threads, wchar, dynamic library, C++ -# +# BR2_PACKAGE_FLUIDSYNTH is not set # BR2_PACKAGE_GMRENDER_RESURRECT is not set # BR2_PACKAGE_GSTREAMER1 is not set # BR2_PACKAGE_JACK1 is not set - -# -# jack2 needs a toolchain w/ threads, C++, dynamic library -# +# BR2_PACKAGE_JACK2 is not set BR2_PACKAGE_KODI_ARCH_SUPPORTS=y # @@ -521,31 +510,16 @@ BR2_PACKAGE_KODI_ARCH_SUPPORTS=y # # miraclecast needs systemd and a glibc toolchain w/ threads and wchar # - -# -# mjpegtools needs a toolchain w/ C++, threads -# - -# -# modplugtools needs a toolchain w/ C++ -# +# BR2_PACKAGE_MJPEGTOOLS is not set +# BR2_PACKAGE_MODPLUGTOOLS is not set # BR2_PACKAGE_MOTION is not set - -# -# mpd needs a toolchain w/ C++, threads, wchar, gcc >= 8, host gcc >= 8 -# +# BR2_PACKAGE_MPD is not set # BR2_PACKAGE_MPD_MPC is not set # BR2_PACKAGE_MPG123 is not set - -# -# mpv needs a toolchain w/ C++, NPTL, gcc >= 4.9 -# +# BR2_PACKAGE_MPV is not set # BR2_PACKAGE_MULTICAT is not set # BR2_PACKAGE_MUSEPACK is not set - -# -# ncmpc needs a toolchain w/ C++, wchar, threads, gcc >= 10 -# +# BR2_PACKAGE_NCMPC is not set # BR2_PACKAGE_OPUS_TOOLS is not set # BR2_PACKAGE_PIPEWIRE is not set BR2_PACKAGE_PULSEAUDIO_HAS_ATOMIC=y @@ -554,59 +528,31 @@ BR2_PACKAGE_PULSEAUDIO_HAS_ATOMIC=y # BR2_PACKAGE_SPEECHD is not set # BR2_PACKAGE_SQUEEZELITE is not set # BR2_PACKAGE_TINYCOMPRESS is not set - -# -# tovid needs a toolchain w/ NPTL, C++, wchar, gcc >= 4.9 -# # BR2_PACKAGE_TSTOOLS is not set # BR2_PACKAGE_TWOLAME is not set # BR2_PACKAGE_UDPXY is not set - -# -# upmpdcli needs a toolchain w/ C++, NPTL, gcc >= 4.9 -# - -# -# v4l2grab needs a toolchain w/ threads, dynamic library, C++ and headers >= 3.0 -# +# BR2_PACKAGE_UPMPDCLI is not set +# BR2_PACKAGE_V4L2GRAB is not set # BR2_PACKAGE_V4L2LOOPBACK is not set - -# -# vlc needs a toolchain w/ C++, dynamic library, wchar, threads, gcc >= 4.9, headers >= 3.7 -# +# BR2_PACKAGE_VLC is not set # BR2_PACKAGE_VORBIS_TOOLS is not set # BR2_PACKAGE_WAVPACK is not set # BR2_PACKAGE_YAVTA is not set # BR2_PACKAGE_YMPD is not set - -# -# zynaddsubfx needs a toolchain w/ C++11 and threads -# +# BR2_PACKAGE_ZYNADDSUBFX is not set # # Compressors and decompressors # # BR2_PACKAGE_BROTLI is not set # BR2_PACKAGE_BZIP2 is not set - -# -# lrzip needs a toolchain w/ wchar, threads, C++ -# - -# -# lzip needs a toolchain w/ C++ -# +# BR2_PACKAGE_LRZIP is not set +# BR2_PACKAGE_LZIP is not set # BR2_PACKAGE_LZOP is not set - -# -# p7zip needs a toolchain w/ threads, wchar, C++ -# +# BR2_PACKAGE_P7ZIP is not set # BR2_PACKAGE_PIGZ is not set # BR2_PACKAGE_PIXZ is not set - -# -# unrar needs a toolchain w/ C++, wchar, threads, gcc >= 4.8 -# +# BR2_PACKAGE_UNRAR is not set # BR2_PACKAGE_XZ is not set # BR2_PACKAGE_ZIP is not set # BR2_PACKAGE_ZSTD is not set @@ -616,10 +562,7 @@ BR2_PACKAGE_PULSEAUDIO_HAS_ATOMIC=y # # BR2_PACKAGE_BABELTRACE2 is not set # BR2_PACKAGE_BLKTRACE is not set - -# -# bonnie++ needs a toolchain w/ C++ -# +# BR2_PACKAGE_BONNIE is not set # BR2_PACKAGE_CACHE_CALIBRATOR is not set # @@ -641,16 +584,10 @@ BR2_PACKAGE_DHRYSTONE=y # BR2_PACKAGE_DROPWATCH is not set # BR2_PACKAGE_DSTAT is not set # BR2_PACKAGE_DT is not set - -# -# duma needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_DUMA is not set # BR2_PACKAGE_FIO is not set BR2_PACKAGE_GDB_ARCH_SUPPORTS=y - -# -# gdb/gdbserver >= 8.x needs a toolchain w/ C++, gcc >= 4.8 -# +# BR2_PACKAGE_GDB is not set # BR2_PACKAGE_IOZONE is not set # BR2_PACKAGE_KMEMD is not set # BR2_PACKAGE_LATENCYTOP is not set @@ -669,23 +606,13 @@ BR2_PACKAGE_LTP_TESTSUITE_ARCH_SUPPORTS=y # BR2_PACKAGE_PAX_UTILS is not set BR2_PACKAGE_PERFTEST_ARCH_SUPPORTS=y # BR2_PACKAGE_PERFTEST is not set - -# -# piglit needs a glibc or musl toolchain w/ C++ -# # BR2_PACKAGE_POKE is not set # BR2_PACKAGE_PV is not set # BR2_PACKAGE_RAMSMP is not set BR2_PACKAGE_RAMSPEED=y # BR2_PACKAGE_RT_TESTS is not set - -# -# rwmem needs a toolchain w/ C++, wchar, gcc >= 5 -# - -# -# signal-estimator needs a toochain w/ C++, threads, gcc >= 7 -# +# BR2_PACKAGE_RWMEM is not set +# BR2_PACKAGE_SIGNAL_ESTIMATOR is not set # BR2_PACKAGE_SPIDEV_TEST is not set # BR2_PACKAGE_STRACE is not set # BR2_PACKAGE_STRESS is not set @@ -709,33 +636,18 @@ BR2_PACKAGE_WHETSTONE=y # BR2_PACKAGE_BSDIFF is not set # BR2_PACKAGE_CHECK is not set BR2_PACKAGE_CMAKE_ARCH_SUPPORTS=y - -# -# ctest needs a toolchain w/ C++, wchar, dynamic library, gcc >= 4.7, NPTL -# - -# -# cppunit needs a toolchain w/ C++, dynamic library -# +# BR2_PACKAGE_CMAKE_CTEST is not set +# BR2_PACKAGE_CPPUNIT is not set # BR2_PACKAGE_CUKINIA is not set # BR2_PACKAGE_CUNIT is not set # BR2_PACKAGE_CVS is not set - -# -# cxxtest needs a toolchain w/ C++ support -# +# BR2_PACKAGE_CXXTEST is not set # BR2_PACKAGE_FLEX is not set # BR2_PACKAGE_GETTEXT is not set BR2_PACKAGE_PROVIDES_HOST_GETTEXT="host-gettext-tiny" # BR2_PACKAGE_GIT is not set - -# -# git-crypt needs a toolchain w/ C++, gcc >= 4.9 -# - -# -# gperf needs a toolchain w/ C++ -# +# BR2_PACKAGE_GIT_CRYPT is not set +# BR2_PACKAGE_GPERF is not set # BR2_PACKAGE_JO is not set # BR2_PACKAGE_JQ is not set # BR2_PACKAGE_LIBTOOL is not set @@ -837,17 +749,15 @@ BR2_PACKAGE_PROVIDES_HOST_GETTEXT="host-gettext-tiny" # # BR2_PACKAGE_ASCII_INVADERS is not set # BR2_PACKAGE_CHOCOLATE_DOOM is not set - -# -# flare-engine needs a toolchain w/ C++, dynamic library -# +# BR2_PACKAGE_FLARE_ENGINE is not set # BR2_PACKAGE_FROTZ is not set - -# -# gnuchess needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_GNUCHESS is not set # BR2_PACKAGE_LBREAKOUT2 is not set # BR2_PACKAGE_LTRIS is not set + +# +# minetest needs X11 and an OpenGL provider +# # BR2_PACKAGE_OPENTYRIAN is not set # BR2_PACKAGE_PRBOOM is not set # BR2_PACKAGE_SL is not set @@ -855,10 +765,7 @@ BR2_PACKAGE_PROVIDES_HOST_GETTEXT="host-gettext-tiny" # # solarus needs OpenGL and a toolchain w/ C++, gcc >= 4.9, NPTL, dynamic library, and luajit or lua 5.1 # - -# -# stella needs a toolchain w/ dynamic library, C++, threads, gcc >= 7 -# +# BR2_PACKAGE_STELLA is not set # BR2_PACKAGE_XORCURSES is not set # @@ -880,7 +787,7 @@ BR2_PACKAGE_PROVIDES_HOST_GETTEXT="host-gettext-tiny" # BR2_PACKAGE_GHOSTSCRIPT is not set # -# glmark2 needs a toolchain w/ C++, gcc >= 4.9 +# glmark2 needs an OpenGL or an openGL ES and EGL backend # # @@ -892,16 +799,9 @@ BR2_PACKAGE_PROVIDES_HOST_GETTEXT="host-gettext-tiny" # # kmscube needs EGL, GBM and OpenGL ES, and a toolchain w/ thread support # - -# -# libva-utils needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_LIBVA_UTILS is not set BR2_PACKAGE_MIDORI_ARCH_SUPPORTS=y -# -# midori needs a glibc toolchain w/ C++, wchar, threads, dynamic library, gcc >= 7, host gcc >= 8 -# - # # midori needs libgtk3 w/ X11 or wayland backend # @@ -917,58 +817,29 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y # # sway needs systemd, udev, EGL w/ Wayland backend and OpenGL ES support # - -# -# sway needs a toolchain w/ wchar, threads, C++, dynamic library, gcc >= 4.9 -# - -# -# tesseract-ocr needs a toolchain w/ threads, C++, gcc >= 7, dynamic library, wchar -# +# BR2_PACKAGE_TESSERACT_OCR is not set # BR2_PACKAGE_TINIFIER is not set # # Graphic libraries # - -# -# cegui needs a toolchain w/ C++, threads, dynamic library, wchar, gcc >= 5 -# - -# -# directfb needs a glibc or uClibc toolchain w/ C++, NPTL, gcc >= 4.5, dynamic library -# - -# -# efl needs a toolchain w/ C++, dynamic library, gcc >= 4.9, host gcc >= 4.9, threads, wchar -# +# BR2_PACKAGE_CEGUI is not set +# BR2_PACKAGE_DIRECTFB is not set # BR2_PACKAGE_FB_TEST_APP is not set # BR2_PACKAGE_FBDUMP is not set # BR2_PACKAGE_FBGRAB is not set - -# -# fbterm needs a toolchain w/ C++, wchar, locale -# +# BR2_PACKAGE_FBTERM is not set # BR2_PACKAGE_FBV is not set - -# -# freerdp needs a toolchain w/ wchar, dynamic library, threads, C++ -# +# BR2_PACKAGE_FREERDP is not set # BR2_PACKAGE_GRAPHICSMAGICK is not set # BR2_PACKAGE_IMAGEMAGICK is not set # BR2_PACKAGE_LIBGLVND is not set # BR2_PACKAGE_LINUX_FUSION is not set +# BR2_PACKAGE_MESA3D is not set +# BR2_PACKAGE_OCRAD is not set # -# mesa3d needs a toolchain w/ gcc >=8, C++, NPTL, dynamic library -# - -# -# ocrad needs a toolchain w/ C++ -# - -# -# ogre needs a toolchain w/ C++, dynamic library, gcc >= 4.8, threads, wchar +# ogre needs X11 and an OpenGL provider # # BR2_PACKAGE_PSPLASH is not set # BR2_PACKAGE_SDL is not set @@ -978,10 +849,7 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y # # Other GUIs # - -# -# Qt5 needs host g++ >= 5.0, and a toolchain w/ gcc >= 5.0, wchar, NPTL, C++, dynamic library -# +# BR2_PACKAGE_QT5 is not set # # tekui needs a Lua interpreter and a toolchain w/ threads, dynamic library @@ -991,18 +859,7 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y # weston needs udev and a toolchain w/ locale, threads, dynamic library, headers >= 3.0 # # BR2_PACKAGE_XORG7 is not set - -# -# apitrace needs a toolchain w/ C++, wchar, dynamic library, threads, gcc >= 7 -# - -# -# mupdf needs a toolchain w/ C++, gcc >= 4.9 -# - -# -# vte needs a uClibc or glibc toolchain w/ wchar, threads, C++, gcc >= 10 -# +# BR2_PACKAGE_APITRACE is not set # # vte needs an OpenGL or an OpenGL-EGL/wayland backend @@ -1032,16 +889,10 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y # BR2_PACKAGE_18XX_TI_UTILS is not set # BR2_PACKAGE_ACPICA is not set # BR2_PACKAGE_ACPID is not set - -# -# acpitool needs a toolchain w/ threads, C++, dynamic library -# +# BR2_PACKAGE_ACPITOOL is not set # BR2_PACKAGE_AER_INJECT is not set # BR2_PACKAGE_ALTERA_STAPL is not set - -# -# apcupsd needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_APCUPSD is not set # BR2_PACKAGE_AVRDUDE is not set # @@ -1052,10 +903,7 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y # brickd needs udev /dev management, a toolchain w/ threads, wchar # # BR2_PACKAGE_BRLTTY is not set - -# -# cc-tool needs a toolchain w/ C++, threads, wchar, gcc >= 4.9 -# +# BR2_PACKAGE_CC_TOOL is not set # BR2_PACKAGE_CDRKIT is not set # BR2_PACKAGE_CRUCIBLE is not set # BR2_PACKAGE_CRYPTSETUP is not set @@ -1067,10 +915,7 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y # # dbusbroker needs systemd and a toolchain w/ threads # - -# -# dbus-cxx needs a toolchain w/ C++, threads, gcc >= 7 and dynamic library support -# +# BR2_PACKAGE_DBUS_CXX is not set # BR2_PACKAGE_DFU_UTIL is not set # BR2_PACKAGE_DMRAID is not set @@ -1082,10 +927,7 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y # BR2_PACKAGE_DUMP1090 is not set # BR2_PACKAGE_DVB_APPS is not set # BR2_PACKAGE_DVBSNOOP is not set - -# -# edid-decode needs a toolchain w/ C++, gcc >= 4.7 -# +# BR2_PACKAGE_EDID_DECODE is not set # # eudev needs eudev /dev management @@ -1097,15 +939,11 @@ BR2_PACKAGE_NETSURF_ARCH_SUPPORTS=y BR2_PACKAGE_FLASHROM_ARCH_SUPPORTS=y # BR2_PACKAGE_FLASHROM is not set # BR2_PACKAGE_FMTOOLS is not set -BR2_PACKAGE_FPGA_AXI_SDC=y # BR2_PACKAGE_FREEIPMI is not set # BR2_PACKAGE_FXLOAD is not set # BR2_PACKAGE_GPM is not set # BR2_PACKAGE_GPSD is not set - -# -# gptfdisk needs a toolchain w/ C++ -# +# BR2_PACKAGE_GPTFDISK is not set # BR2_PACKAGE_GVFS is not set # BR2_PACKAGE_HDDTEMP is not set # BR2_PACKAGE_HWDATA is not set @@ -1115,25 +953,16 @@ BR2_PACKAGE_FPGA_AXI_SDC=y # BR2_PACKAGE_IRDA_UTILS is not set # BR2_PACKAGE_KBD is not set # BR2_PACKAGE_LCDPROC is not set - -# -# libiec61850 needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_LIBIEC61850 is not set # BR2_PACKAGE_LIBMANETTE is not set # BR2_PACKAGE_LIBUBOOTENV is not set # BR2_PACKAGE_LIBUIO is not set # BR2_PACKAGE_LINUX_BACKPORTS is not set # BR2_PACKAGE_LINUX_SERIAL_TEST is not set # BR2_PACKAGE_LINUXCONSOLETOOLS is not set - -# -# lirc-tools needs a toolchain w/ threads, dynamic library, C++ -# +# BR2_PACKAGE_LIRC_TOOLS is not set # BR2_PACKAGE_LM_SENSORS is not set - -# -# lshw needs a toolchain w/ C++, wchar -# +# BR2_PACKAGE_LSHW is not set # BR2_PACKAGE_LSSCSI is not set # BR2_PACKAGE_LSUIO is not set # BR2_PACKAGE_LUKSMETA is not set @@ -1150,25 +979,16 @@ BR2_PACKAGE_FPGA_AXI_SDC=y # BR2_PACKAGE_NVIDIA_MODPROBE is not set # BR2_PACKAGE_NVME is not set # BR2_PACKAGE_OFONO is not set - -# -# ola needs a toolchain w/ C++, threads, dynamic library, gcc >= 4.8 -# +# BR2_PACKAGE_OLA is not set # BR2_PACKAGE_OPEN2300 is not set - -# -# openfpgaloader needs a toolchain w/ threads, C++, gcc >= 4.9 -# +# BR2_PACKAGE_OPENFPGALOADER is not set # BR2_PACKAGE_OPENIPMI is not set # BR2_PACKAGE_OPENOCD is not set # BR2_PACKAGE_PARTED is not set # BR2_PACKAGE_PCIUTILS is not set # BR2_PACKAGE_PDBG is not set # BR2_PACKAGE_PICOCOM is not set - -# -# powertop needs a toolchain w/ C++, threads, wchar -# +# BR2_PACKAGE_POWERTOP is not set # BR2_PACKAGE_PPS_TOOLS is not set # BR2_PACKAGE_QORIQ_CADENCE_DP_FIRMWARE is not set # BR2_PACKAGE_RASPI_GPIO is not set @@ -1193,10 +1013,7 @@ BR2_PACKAGE_FPGA_AXI_SDC=y # BR2_PACKAGE_SG3_UTILS is not set # BR2_PACKAGE_SIGROK_CLI is not set # BR2_PACKAGE_SISPMCTL is not set - -# -# smartmontools needs a toolchain w/ C++ -# +# BR2_PACKAGE_SMARTMONTOOLS is not set # BR2_PACKAGE_SMSTOOLS3 is not set # BR2_PACKAGE_SPI_TOOLS is not set # BR2_PACKAGE_SREDIRD is not set @@ -1225,10 +1042,7 @@ BR2_PACKAGE_FPGA_AXI_SDC=y # # BR2_PACKAGE_USB_MODESWITCH is not set # BR2_PACKAGE_USB_MODESWITCH_DATA is not set - -# -# usbguard needs a toolchain w/ C++, threads, dynamic library, gcc >= 8 -# +# BR2_PACKAGE_USBGUARD is not set # # usbmount requires udev to be enabled @@ -1283,21 +1097,12 @@ BR2_PACKAGE_PHP_ARCH_SUPPORTS=y # Audio/Sound # # BR2_PACKAGE_ALSA_LIB is not set - -# -# alure needs a toolchain w/ C++, gcc >= 4.9, NPTL, wchar -# +# BR2_PACKAGE_ALURE is not set # BR2_PACKAGE_AUBIO is not set # BR2_PACKAGE_BCG729 is not set - -# -# caps needs a toolchain w/ C++, dynamic library -# +# BR2_PACKAGE_CAPS is not set # BR2_PACKAGE_LIBAO is not set - -# -# asplib needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBASPLIB is not set # BR2_PACKAGE_LIBBROADVOICE is not set # BR2_PACKAGE_LIBCDAUDIO is not set # BR2_PACKAGE_LIBCDDB is not set @@ -1313,41 +1118,23 @@ BR2_PACKAGE_PHP_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBILBC is not set # BR2_PACKAGE_LIBLO is not set # BR2_PACKAGE_LIBMAD is not set - -# -# libmodplug needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBMODPLUG is not set # BR2_PACKAGE_LIBMPD is not set # BR2_PACKAGE_LIBMPDCLIENT is not set # BR2_PACKAGE_LIBREPLAYGAIN is not set # BR2_PACKAGE_LIBSAMPLERATE is not set - -# -# libsidplay2 needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBSIDPLAY2 is not set # BR2_PACKAGE_LIBSILK is not set # BR2_PACKAGE_LIBSNDFILE is not set - -# -# libsoundtouch needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBSOUNDTOUCH is not set # BR2_PACKAGE_LIBSOXR is not set # BR2_PACKAGE_LIBVORBIS is not set # BR2_PACKAGE_LILV is not set # BR2_PACKAGE_LV2 is not set - -# -# mp4v2 needs a toolchain w/ C++ -# +# BR2_PACKAGE_MP4V2 is not set BR2_PACKAGE_OPENAL_ARCH_SUPPORTS=y - -# -# openal needs a toolchain w/ NPTL, C++, gcc >= 4.9 -# - -# -# opencore-amr needs a toolchain w/ C++ -# +# BR2_PACKAGE_OPENAL is not set +# BR2_PACKAGE_OPENCORE_AMR is not set # BR2_PACKAGE_OPUS is not set # BR2_PACKAGE_OPUSFILE is not set # BR2_PACKAGE_PORTAUDIO is not set @@ -1356,10 +1143,7 @@ BR2_PACKAGE_OPENAL_ARCH_SUPPORTS=y # BR2_PACKAGE_SPEEX is not set # BR2_PACKAGE_SPEEXDSP is not set # BR2_PACKAGE_SRATOM is not set - -# -# taglib needs a toolchain w/ C++, wchar -# +# BR2_PACKAGE_TAGLIB is not set # BR2_PACKAGE_TINYALSA is not set # BR2_PACKAGE_TREMOR is not set # BR2_PACKAGE_VO_AACENC is not set @@ -1370,19 +1154,13 @@ BR2_PACKAGE_OPENAL_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBARCHIVE is not set # BR2_PACKAGE_LIBDEFLATE is not set # BR2_PACKAGE_LIBMSPACK is not set - -# -# libsquish needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBSQUISH is not set # BR2_PACKAGE_LIBZIP is not set # BR2_PACKAGE_LZ4 is not set # BR2_PACKAGE_LZO is not set # BR2_PACKAGE_MINIZIP is not set # BR2_PACKAGE_MINIZIP_ZLIB is not set - -# -# snappy needs a toolchain w/ C++ -# +# BR2_PACKAGE_SNAPPY is not set # BR2_PACKAGE_SZIP is not set # BR2_PACKAGE_ZCHUNK is not set BR2_PACKAGE_ZLIB_NG_ARCH_SUPPORTS=y @@ -1396,16 +1174,10 @@ BR2_PACKAGE_PROVIDES_HOST_ZLIB="host-libzlib" # BR2_PACKAGE_BEARSSL is not set # BR2_PACKAGE_BEECRYPT is not set BR2_PACKAGE_BOTAN_ARCH_SUPPORTS=y - -# -# botan needs a toolchain w/ C++, threads, gcc >= 4.8 -# +# BR2_PACKAGE_BOTAN is not set # BR2_PACKAGE_CA_CERTIFICATES is not set # BR2_PACKAGE_CRYPTODEV is not set - -# -# cryptopp needs a toolchain w/ C++, dynamic library, wchar -# +# BR2_PACKAGE_CRYPTOPP is not set # BR2_PACKAGE_GCR is not set # BR2_PACKAGE_GNUTLS is not set # BR2_PACKAGE_LIBARGON2 is not set @@ -1421,10 +1193,7 @@ BR2_PACKAGE_LIBGPG_ERROR_SYSCFG="riscv64-unknown-linux-gnu" # BR2_PACKAGE_LIBMD is not set # BR2_PACKAGE_LIBMHASH is not set # BR2_PACKAGE_LIBNSS is not set - -# -# libolm needs a toolchain w/ C++, gcc >= 4.8 -# +# BR2_PACKAGE_LIBOLM is not set # BR2_PACKAGE_LIBP11 is not set # BR2_PACKAGE_LIBSCRYPT is not set # BR2_PACKAGE_LIBSECRET is not set @@ -1456,26 +1225,14 @@ BR2_PACKAGE_WOLFSSL_ASM_SUPPORTS=y # BR2_PACKAGE_BERKELEYDB is not set # BR2_PACKAGE_GDBM is not set # BR2_PACKAGE_HIREDIS is not set - -# -# kompexsqlite needs a toolchain w/ C++, wchar, threads, dynamic library -# - -# -# leveldb needs a toolchain w/ C++, threads, gcc >= 4.8 -# +# BR2_PACKAGE_KOMPEXSQLITE is not set +# BR2_PACKAGE_LEVELDB is not set # BR2_PACKAGE_LIBDBI is not set # BR2_PACKAGE_LIBDBI_DRIVERS is not set # BR2_PACKAGE_LIBGIT2 is not set # BR2_PACKAGE_LIBMDBX is not set - -# -# libodb needs a toolchain w/ C++, threads -# - -# -# mysql needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_LIBODB is not set +# BR2_PACKAGE_MYSQL is not set # BR2_PACKAGE_POSTGRESQL is not set # BR2_PACKAGE_REDIS is not set # BR2_PACKAGE_SQLCIPHER is not set @@ -1494,52 +1251,25 @@ BR2_PACKAGE_WOLFSSL_ASM_SUPPORTS=y # BR2_PACKAGE_LIBNFS is not set # BR2_PACKAGE_LIBSYSFS is not set # BR2_PACKAGE_LOCKDEV is not set - -# -# physfs needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_PHYSFS is not set # # Graphics # - -# -# assimp needs a toolchain w/ C++, wchar, gcc >= 7 -# +# BR2_PACKAGE_ASSIMP is not set # BR2_PACKAGE_AT_SPI2_CORE is not set - -# -# atkmm needs a toolchain w/ C++, wchar, threads, gcc >= 7 -# - -# -# atkmm (2.28.x) needs a toolchain w/ C++, wchar, threads, gcc >= 4.9 -# - -# -# bullet needs a toolchain w/ C++, dynamic library, threads, wchar -# +# BR2_PACKAGE_ATKMM is not set +# BR2_PACKAGE_ATKMM2_28 is not set +# BR2_PACKAGE_BULLET is not set # BR2_PACKAGE_CAIRO is not set - -# -# cairomm needs a toolchain w/ C++, wchar, threads, gcc >= 7 -# - -# -# cairomm (1.14.x) needs a toolchain w/ C++, wchar, threads, gcc >= 4.9 -# +# BR2_PACKAGE_CAIROMM is not set +# BR2_PACKAGE_CAIROMM1_14 is not set # # chipmunk needs an OpenGL backend # - -# -# exempi needs a toolchain w/ C++, dynamic library, threads, wchar -# - -# -# exiv2 needs a uClibc or glibc toolchain w/ C++, wchar, dynamic library, threads -# +# BR2_PACKAGE_EXEMPI is not set +# BR2_PACKAGE_EXIV2 is not set # BR2_PACKAGE_FONTCONFIG is not set # BR2_PACKAGE_FREETYPE is not set # BR2_PACKAGE_GD is not set @@ -1549,40 +1279,24 @@ BR2_PACKAGE_WOLFSSL_ASM_SUPPORTS=y # # granite needs libgtk3 and a toolchain w/ wchar, threads, gcc >= 4.9 # - -# -# graphite2 needs a toolchain w/ C++ -# +# BR2_PACKAGE_GRAPHITE2 is not set # # gtkmm3 needs libgtk3 and a toolchain w/ C++, wchar, threads, gcc >= 4.9 # - -# -# harfbuzz needs a toolchain w/ C++, gcc >= 4.9 -# +# BR2_PACKAGE_HARFBUZZ is not set # BR2_PACKAGE_IJS is not set # BR2_PACKAGE_IMLIB2 is not set # -# intel-gmmlib needs a toolchain w/ dynamic library, C++, threads -# - -# -# irrlicht needs a toolchain w/ C++ +# irrlicht needs X11 and an OpenGL provider # # BR2_PACKAGE_JASPER is not set # BR2_PACKAGE_JBIG2DEC is not set # BR2_PACKAGE_JPEG is not set - -# -# kms++ needs a toolchain w/ threads, C++, gcc >= 4.8, headers >= 4.11, wchar -# +# BR2_PACKAGE_KMSXX is not set # BR2_PACKAGE_LCMS2 is not set - -# -# lensfun needs a toolchain w/ C++, threads, wchar -# +# BR2_PACKAGE_LENSFUN is not set # BR2_PACKAGE_LEPTONICA is not set # BR2_PACKAGE_LIBART is not set # BR2_PACKAGE_LIBDMTX is not set @@ -1601,14 +1315,8 @@ BR2_PACKAGE_WOLFSSL_ASM_SUPPORTS=y # # libfreeglut depends on X.org and needs an OpenGL backend # - -# -# libfreeimage needs a toolchain w/ C++, dynamic library, wchar -# - -# -# libgeotiff needs a toolchain w/ C++, gcc >= 4.7, threads, wchar -# +# BR2_PACKAGE_LIBFREEIMAGE is not set +# BR2_PACKAGE_LIBGEOTIFF is not set # # libglew depends on X.org and needs an OpenGL backend @@ -1623,64 +1331,33 @@ BR2_PACKAGE_WOLFSSL_ASM_SUPPORTS=y # # BR2_PACKAGE_LIBGTA is not set -# -# libgtk3 needs a toolchain w/ wchar, threads, C++, gcc >= 4.9 -# - # # libgtk3 needs an OpenGL or an OpenGL-EGL/wayland backend # - -# -# libjxl needs a toolchain with C++, threads, gcc >= 7, dynamic library -# +# BR2_PACKAGE_LIBJXL is not set # BR2_PACKAGE_LIBMEDIAART is not set # BR2_PACKAGE_LIBMNG is not set # BR2_PACKAGE_LIBPNG is not set # BR2_PACKAGE_LIBQRENCODE is not set - -# -# libraw needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBRAW is not set # BR2_PACKAGE_LIBSVG is not set # BR2_PACKAGE_LIBSVG_CAIRO is not set # BR2_PACKAGE_LIBSVGTINY is not set # BR2_PACKAGE_LIBVA is not set - -# -# libvips needs a toolchain w/ wchar, threads, C++ -# +# BR2_PACKAGE_LIBVIPS is not set # # libwpe needs a toolchain w/ C++, dynamic library and an OpenEGL-capable backend # # BR2_PACKAGE_MENU_CACHE is not set - -# -# opencv3 needs a toolchain w/ C++, NPTL, wchar, dynamic library -# - -# -# opencv4 needs a toolchain w/ C++, NPTL, wchar, dynamic library, gcc >= 4.8 -# +# BR2_PACKAGE_OPENCV3 is not set +# BR2_PACKAGE_OPENCV4 is not set # BR2_PACKAGE_OPENJPEG is not set - -# -# pango needs a toolchain w/ wchar, threads, C++, gcc >= 4.9 -# - -# -# pangomm needs a toolchain w/ C++, wchar, threads, gcc >= 7 -# - -# -# pangomm (2.46.x) needs a toolchain w/ C++, wchar, threads, gcc >= 4.9 -# +# BR2_PACKAGE_PANGO is not set +# BR2_PACKAGE_PANGOMM is not set +# BR2_PACKAGE_PANGOMM2_46 is not set # BR2_PACKAGE_PIXMAN is not set - -# -# poppler needs a toolchain w/ wchar, C++, threads, dynamic library, gcc >= 7 -# +# BR2_PACKAGE_POPPLER is not set # BR2_PACKAGE_STB is not set # BR2_PACKAGE_TIFF is not set # BR2_PACKAGE_WAYLAND is not set @@ -1694,31 +1371,18 @@ BR2_PACKAGE_WEBKITGTK_ARCH_SUPPORTS=y # # wlroots needs udev, EGL w/ Wayland backend and OpenGL ES support # - -# -# woff2 needs a toolchain w/ C++ -# +# BR2_PACKAGE_WOFF2 is not set # # wpebackend-fdo needs a toolchain w/ C++, wchar, threads, dynamic library and an OpenEGL-capable Wayland backend # BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y -# -# wpewebkit needs a toolchain w/ C++, wchar, threads, dynamic library, gcc >= 7, host gcc >= 4.9 -# - # # wpewebkit needs an OpenGL ES w/ EGL-capable Wayland backend # - -# -# zbar needs a toolchain w/ threads, C++ and headers >= 3.0 -# - -# -# zxing-cpp needs a toolchain w/ C++, wchar, dynamic library -# +# BR2_PACKAGE_ZBAR is not set +# BR2_PACKAGE_ZXING_CPP is not set # # Hardware handling @@ -1733,14 +1397,8 @@ BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y # hidapi needs udev /dev management and a toolchain w/ NPTL, threads, gcc >= 4.9 # # BR2_PACKAGE_JITTERENTROPY_LIBRARY is not set - -# -# lcdapi needs a toolchain w/ C++, threads -# - -# -# let-me-create needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_LCDAPI is not set +# BR2_PACKAGE_LET_ME_CREATE is not set # BR2_PACKAGE_LIBAIO is not set # @@ -1750,10 +1408,7 @@ BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y # # libblockdev needs udev /dev management and a toolchain w/ wchar, threads, dynamic library, locale # - -# -# libcec needs a toolchain w/ C++, wchar, threads, dynamic library, gcc >= 4.7 -# +# BR2_PACKAGE_LIBCEC is not set # BR2_PACKAGE_LIBFREEFARE is not set # BR2_PACKAGE_LIBFTDI is not set # BR2_PACKAGE_LIBFTDI1 is not set @@ -1780,10 +1435,7 @@ BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBQRTR_GLIB is not set # BR2_PACKAGE_LIBRAW1394 is not set # BR2_PACKAGE_LIBRTLSDR is not set - -# -# libserial needs a toolchain w/ C++, gcc >= 5, threads, wchar -# +# BR2_PACKAGE_LIBSERIAL is not set # BR2_PACKAGE_LIBSERIALPORT is not set # BR2_PACKAGE_LIBSIGROK is not set # BR2_PACKAGE_LIBSIGROKDECODE is not set @@ -1791,10 +1443,7 @@ BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBSS7 is not set # BR2_PACKAGE_LIBUSB is not set # BR2_PACKAGE_LIBUSBGX is not set - -# -# libv4l needs a toolchain w/ threads, C++ and headers >= 3.0 -# +# BR2_PACKAGE_LIBV4L is not set # BR2_PACKAGE_LIBXKBCOMMON is not set # BR2_PACKAGE_MTDEV is not set # BR2_PACKAGE_NEARDAL is not set @@ -1802,14 +1451,8 @@ BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y # BR2_PACKAGE_OWFS is not set # BR2_PACKAGE_PCSC_LITE is not set # BR2_PACKAGE_TSLIB is not set - -# -# uhd needs a toolchain w/ C++, NPTL, wchar, dynamic library, gcc >= 5 -# - -# -# urg needs a toolchain w/ C++ -# +# BR2_PACKAGE_UHD is not set +# BR2_PACKAGE_URG is not set # # Javascript @@ -1834,170 +1477,83 @@ BR2_PACKAGE_WPEWEBKIT_ARCH_SUPPORTS=y # # JSON/XML # - -# -# benejson needs a toolchain w/ C++ -# +# BR2_PACKAGE_BENEJSON is not set # BR2_PACKAGE_CJSON is not set # BR2_PACKAGE_EXPAT is not set # BR2_PACKAGE_JANSSON is not set # BR2_PACKAGE_JOSE is not set # BR2_PACKAGE_JSMN is not set # BR2_PACKAGE_JSON_C is not set - -# -# json-for-modern-cpp needs a toolchain w/ C++, gcc >= 4.9 -# +# BR2_PACKAGE_JSON_FOR_MODERN_CPP is not set # BR2_PACKAGE_JSON_GLIB is not set - -# -# jsoncpp needs a toolchain w/ C++, gcc >= 4.7 -# +# BR2_PACKAGE_JSONCPP is not set # BR2_PACKAGE_LIBBSON is not set # BR2_PACKAGE_LIBFASTJSON is not set - -# -# libjson needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBJSON is not set # BR2_PACKAGE_LIBROXML is not set # BR2_PACKAGE_LIBUCL is not set # BR2_PACKAGE_LIBXML2 is not set - -# -# libxml++ needs a toolchain w/ C++, wchar, threads, gcc >= 7 -# +# BR2_PACKAGE_LIBXMLPP is not set # BR2_PACKAGE_LIBXMLRPC is not set # BR2_PACKAGE_LIBXSLT is not set # BR2_PACKAGE_LIBYAML is not set # BR2_PACKAGE_MXML is not set - -# -# pugixml needs a toolchain w/ C++ -# - -# -# rapidjson needs a toolchain w/ C++ -# +# BR2_PACKAGE_PUGIXML is not set +# BR2_PACKAGE_RAPIDJSON is not set # BR2_PACKAGE_RAPIDXML is not set # BR2_PACKAGE_RAPTOR is not set # BR2_PACKAGE_SERD is not set # BR2_PACKAGE_SORD is not set - -# -# tinyxml needs a toolchain w/ C++ -# - -# -# tinyxml2 needs a toolchain w/ C++ -# - -# -# valijson needs a toolchain w/ C++ -# - -# -# xerces-c++ needs a toolchain w/ C++, dynamic library, wchar -# - -# -# xml-security-c needs a toolchain w/ C++, wchar, dynamic library, threads, gcc >= 4.7 -# +# BR2_PACKAGE_TINYXML is not set +# BR2_PACKAGE_TINYXML2 is not set +# BR2_PACKAGE_VALIJSON is not set +# BR2_PACKAGE_XERCES is not set +# BR2_PACKAGE_XML_SECURITY_C is not set # BR2_PACKAGE_YAJL is not set - -# -# yaml-cpp needs a toolchain w/ C++, gcc >= 4.7 -# +# BR2_PACKAGE_YAML_CPP is not set # # Logging # - -# -# glog needs a toolchain w/ C++ -# - -# -# hawktracer needs a toolchain w/ C++, gcc >= 4.8 -# +# BR2_PACKAGE_GLOG is not set +# BR2_PACKAGE_HAWKTRACER is not set # BR2_PACKAGE_LIBLOG4C_LOCALTIME is not set # BR2_PACKAGE_LIBLOGGING is not set - -# -# log4cplus needs a toolchain w/ C++, wchar, threads, gcc >= 4.8 -# - -# -# log4cpp needs a toolchain w/ C++, threads -# - -# -# log4cxx needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_LOG4CPLUS is not set +# BR2_PACKAGE_LOG4CPP is not set +# BR2_PACKAGE_LOG4CXX is not set # # log4qt needs qt5 # - -# -# opentracing-cpp needs a toolchain w/ C++, threads, dynamic library, gcc >= 4.8 -# - -# -# spdlog needs a toolchain w/ C++, threads, wchar -# - -# -# ulog needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_OPENTRACING_CPP is not set +# BR2_PACKAGE_SPDLOG is not set +# BR2_PACKAGE_ULOG is not set # BR2_PACKAGE_ZLOG is not set # # Multimedia # - -# -# bento4 support needs a toolchain with C++ -# +# BR2_PACKAGE_BENTO4 is not set # BR2_PACKAGE_BITSTREAM is not set # BR2_PACKAGE_DAV1D is not set - -# -# kvazaar needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_KVAZAAR is not set # BR2_PACKAGE_LIBAACS is not set - -# -# libass needs a toolchain w/ C++, gcc >= 4.9 -# +# BR2_PACKAGE_LIBASS is not set # BR2_PACKAGE_LIBBDPLUS is not set # BR2_PACKAGE_LIBBLURAY is not set BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y - -# -# libcamera needs a toolchain w/ C++, threads, wchar, dynamic library, gcc >= 8 -# - -# -# libcamera-apps needs a toolchain w/ C++, threads, wchar, dynamic library, gcc >= 8 -# +# BR2_PACKAGE_LIBCAMERA is not set +# BR2_PACKAGE_LIBCAMERA_APPS is not set # BR2_PACKAGE_LIBDVBCSA is not set # BR2_PACKAGE_LIBDVBPSI is not set - -# -# libdvbsi++ needs a toolchain w/ C++, wchar, threads -# +# BR2_PACKAGE_LIBDVBSI is not set # BR2_PACKAGE_LIBDVDCSS is not set # BR2_PACKAGE_LIBDVDNAV is not set # BR2_PACKAGE_LIBDVDREAD is not set - -# -# libebml needs a toolchain w/ C++, wchar -# +# BR2_PACKAGE_LIBEBML is not set # BR2_PACKAGE_LIBHDHOMERUN is not set - -# -# libmatroska needs a toolchain w/ C++, wchar -# +# BR2_PACKAGE_LIBMATROSKA is not set # BR2_PACKAGE_LIBMMS is not set # BR2_PACKAGE_LIBMPEG2 is not set # BR2_PACKAGE_LIBOGG is not set @@ -2006,99 +1562,48 @@ BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBTHEORA is not set # BR2_PACKAGE_LIBUDFREAD is not set # BR2_PACKAGE_LIBVPX is not set - -# -# libyuv needs a toolchain w/ C++, dynamic library -# - -# -# live555 needs a toolchain w/ C++ -# - -# -# mediastreamer needs a toolchain w/ threads, C++, dynamic library, gcc >= 5 -# +# BR2_PACKAGE_LIBYUV is not set +# BR2_PACKAGE_LIVE555 is not set +# BR2_PACKAGE_MEDIASTREAMER is not set # BR2_PACKAGE_X264 is not set - -# -# x265 needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_X265 is not set # # Networking # - -# -# agent++ needs a toolchain w/ threads, C++, dynamic library -# - -# -# azmq needs a toolchain w/ C++11, wchar and threads -# - -# -# azure-iot-sdk-c needs a toolchain w/ C++, NPTL and wchar -# +# BR2_PACKAGE_AGENTPP is not set +# BR2_PACKAGE_AZMQ is not set +# BR2_PACKAGE_AZURE_IOT_SDK_C is not set # BR2_PACKAGE_BATMAN_ADV is not set - -# -# belle-sip needs a toolchain w/ threads, C++, dynamic library, wchar -# +# BR2_PACKAGE_BELLE_SIP is not set # BR2_PACKAGE_C_ARES is not set # BR2_PACKAGE_CGIC is not set # BR2_PACKAGE_CNI_PLUGINS is not set - -# -# cppzmq needs a toolchain w/ C++, threads -# - -# -# curlpp needs a toolchain w/ C++, dynamic library -# - -# -# czmq needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_CPPZMQ is not set +# BR2_PACKAGE_CURLPP is not set +# BR2_PACKAGE_CZMQ is not set # BR2_PACKAGE_DAQ is not set # BR2_PACKAGE_DAQ3 is not set # BR2_PACKAGE_DAVICI is not set # BR2_PACKAGE_DHT is not set # BR2_PACKAGE_ENET is not set - -# -# filemq needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_FILEMQ is not set # BR2_PACKAGE_FLICKCURL is not set # BR2_PACKAGE_FREERADIUS_CLIENT is not set # BR2_PACKAGE_GENSIO is not set # BR2_PACKAGE_GEOIP is not set # BR2_PACKAGE_GLIB_NETWORKING is not set - -# -# grpc needs a toolchain w/ C++, threads, dynamic library, gcc >= 5 -# +# BR2_PACKAGE_GRPC is not set # BR2_PACKAGE_GSSDP is not set # BR2_PACKAGE_GUPNP is not set # BR2_PACKAGE_GUPNP_AV is not set # BR2_PACKAGE_GUPNP_DLNA is not set - -# -# ibrcommon needs a toolchain w/ C++, threads -# - -# -# ibrdtn needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_IBRCOMMON is not set +# BR2_PACKAGE_IBRDTN is not set # BR2_PACKAGE_LIBCGI is not set - -# -# libcgicc needs a toolchain w/ C++ -# +# BR2_PACKAGE_LIBCGICC is not set # BR2_PACKAGE_LIBCOAP is not set - -# -# libcpprestsdk needs a toolchain w/ NPTL, C++, wchar, locale -# +# BR2_PACKAGE_LIBCPPRESTSDK is not set # BR2_PACKAGE_LIBCURL is not set # BR2_PACKAGE_LIBDNET is not set # BR2_PACKAGE_LIBEXOSIP2 is not set @@ -2107,10 +1612,7 @@ BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBGSASL is not set # BR2_PACKAGE_LIBHTP is not set # BR2_PACKAGE_LIBHTTPPARSER is not set - -# -# libhttpserver needs a toolchain w/ C++, threads, gcc >= 5 -# +# BR2_PACKAGE_LIBHTTPSERVER is not set # BR2_PACKAGE_LIBIDN is not set # BR2_PACKAGE_LIBIDN2 is not set # BR2_PACKAGE_LIBISCSI is not set @@ -2118,18 +1620,12 @@ BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBLDNS is not set # BR2_PACKAGE_LIBMAXMINDDB is not set # BR2_PACKAGE_LIBMBUS is not set - -# -# libmemcached needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_LIBMEMCACHED is not set # BR2_PACKAGE_LIBMICROHTTPD is not set # BR2_PACKAGE_LIBMINIUPNPC is not set # BR2_PACKAGE_LIBMNL is not set # BR2_PACKAGE_LIBMODBUS is not set - -# -# libmodsecurity needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_LIBMODSECURITY is not set # BR2_PACKAGE_LIBNATPMP is not set # BR2_PACKAGE_LIBNDP is not set # BR2_PACKAGE_LIBNET is not set @@ -2145,19 +1641,13 @@ BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBNICE is not set # BR2_PACKAGE_LIBNIDS is not set # BR2_PACKAGE_LIBNL is not set - -# -# libnpupnp needs a toolchain w/ C++, threads, gcc >= 4.9 -# +# BR2_PACKAGE_LIBNPUPNP is not set # BR2_PACKAGE_LIBOAUTH is not set # BR2_PACKAGE_LIBOPING is not set # BR2_PACKAGE_LIBOSIP2 is not set # BR2_PACKAGE_LIBPAGEKITE is not set # BR2_PACKAGE_LIBPCAP is not set - -# -# libpjsip needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_LIBPJSIP is not set # BR2_PACKAGE_LIBPSL is not set # BR2_PACKAGE_LIBRELP is not set # BR2_PACKAGE_LIBRSYNC is not set @@ -2170,30 +1660,14 @@ BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBTEAM is not set # BR2_PACKAGE_LIBTELNET is not set # BR2_PACKAGE_LIBTIRPC is not set - -# -# libtorrent needs a toolchain w/ C++, threads -# - -# -# libtorrent-rasterbar needs a toolchain w/ C++, threads, wchar, gcc >= 4.9 -# +# BR2_PACKAGE_LIBTORRENT is not set +# BR2_PACKAGE_LIBTORRENT_RASTERBAR is not set # BR2_PACKAGE_LIBUEV is not set # BR2_PACKAGE_LIBUHTTPD is not set - -# -# libuhttpd needs a toolchain w/ gcc >= 4.9 -# # BR2_PACKAGE_LIBUPNP is not set - -# -# libupnpp needs a toolchain w/ C++, threads, gcc >= 4.9 -# +# BR2_PACKAGE_LIBUPNPP is not set # BR2_PACKAGE_LIBURIPARSER is not set - -# -# libutp support needs a toolchain with C++ -# +# BR2_PACKAGE_LIBUTP is not set # BR2_PACKAGE_LIBUWSC is not set # BR2_PACKAGE_LIBVNCSERVER is not set # BR2_PACKAGE_LIBWEBSOCK is not set @@ -2204,213 +1678,87 @@ BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y # BR2_PACKAGE_MONGOOSE is not set # BR2_PACKAGE_NANOMSG is not set # BR2_PACKAGE_NEON is not set - -# -# netopeer2 needs a toolchain w/ gcc >= 4.8, C++, threads, dynamic library -# +# BR2_PACKAGE_NETOPEER2 is not set # BR2_PACKAGE_NGHTTP2 is not set - -# -# norm needs a toolchain w/ C++, threads, dynamic library -# +# BR2_PACKAGE_NORM is not set # BR2_PACKAGE_NSS_MYHOSTNAME is not set # BR2_PACKAGE_NSS_PAM_LDAPD is not set - -# -# omniORB needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_OMNIORB is not set # BR2_PACKAGE_OPEN_ISNS is not set # BR2_PACKAGE_OPEN62541 is not set # BR2_PACKAGE_OPENLDAP is not set - -# -# openmpi needs a toolchain w/ dynamic library, NPTL, wchar, C++ -# +# BR2_PACKAGE_OPENMPI is not set # BR2_PACKAGE_OPENPGM is not set - -# -# openzwave needs a toolchain w/ C++, dynamic library, NPTL, wchar -# - -# -# ortp needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_OPENZWAVE is not set +# BR2_PACKAGE_ORTP is not set # BR2_PACKAGE_PAHO_MQTT_C is not set - -# -# paho-mqtt-cpp needs a toolchain w/ threads, C++ -# - -# -# pistache needs a toolchain w/ C++, gcc >= 7, threads, wchar, not binutils bug 27597 -# +# BR2_PACKAGE_PAHO_MQTT_CPP is not set +# BR2_PACKAGE_PISTACHE is not set # BR2_PACKAGE_QDECODER is not set - -# -# qpid-proton needs a toolchain w/ C++, dynamic library, threads -# +# BR2_PACKAGE_QPID_PROTON is not set # BR2_PACKAGE_RABBITMQ_C is not set - -# -# resiprocate needs a toolchain w/ C++, threads, wchar -# - -# -# restclient-cpp needs a toolchain w/ C++, gcc >= 4.8 -# +# BR2_PACKAGE_RESIPROCATE is not set +# BR2_PACKAGE_RESTCLIENT_CPP is not set # BR2_PACKAGE_RTMPDUMP is not set # BR2_PACKAGE_SIPROXD is not set # BR2_PACKAGE_SLIRP is not set # BR2_PACKAGE_SLIRP4NETNS is not set - -# -# snmp++ needs a toolchain w/ threads, C++, dynamic library -# +# BR2_PACKAGE_SNMPPP is not set # BR2_PACKAGE_SOFIA_SIP is not set # BR2_PACKAGE_SSCEP is not set - -# -# sysrepo needs a toolchain w/ C++, NPTL, dynamic library, gcc >= 4.8 -# - -# -# thrift needs a toolchain w/ C++, wchar, threads -# +# BR2_PACKAGE_SYSREPO is not set +# BR2_PACKAGE_THRIFT is not set # BR2_PACKAGE_USBREDIR is not set - -# -# wampcc needs a toolchain w/ C++, NPTL, dynamic library -# - -# -# websocketpp needs a toolchain w/ C++ and gcc >= 4.8 -# - -# -# zeromq needs a toolchain w/ C++, threads -# - -# -# zmqpp needs a toolchain w/ C++, threads, gcc >= 4.7 -# - -# -# zyre needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_WAMPCC is not set +# BR2_PACKAGE_WEBSOCKETPP is not set +# BR2_PACKAGE_ZEROMQ is not set +# BR2_PACKAGE_ZMQPP is not set +# BR2_PACKAGE_ZYRE is not set # # Other # - -# -# ACE needs a glibc toolchain, dynamic library, C++, gcc >= 4.8 -# +# BR2_PACKAGE_ACE is not set # BR2_PACKAGE_APR is not set # BR2_PACKAGE_APR_UTIL is not set # # armadillo needs a toolchain w/ fortran, C++ # - -# -# atf needs a toolchain w/ C++ -# +# BR2_PACKAGE_ATF is not set # BR2_PACKAGE_AVRO_C is not set - -# -# bctoolbox needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_BCTOOLBOX is not set # BR2_PACKAGE_BDWGC is not set - -# -# belr needs a toolchain w/ threads, C++ -# - -# -# boost needs a toolchain w/ C++, threads, wchar -# - -# -# c-capnproto needs host and target gcc >= 5 w/ C++14, threads, atomic, ucontext and not gcc bug 64735 -# - -# -# capnproto needs host and target gcc >= 5 w/ C++14, threads, atomic, ucontext and not gcc bug 64735 -# - -# -# catch2 needs a toolchain w/ C++, wchar, threads, gcc >= 5 -# - -# -# cctz needs a toolchain w/ C++, threads, gcc >= 4.8 -# - -# -# cereal needs a toolchain w/ C++, gcc >= 4.7, threads, wchar -# - -# -# clang needs a toolchain w/ wchar, threads, C++, gcc >= 5, dynamic library, host gcc >= 5 -# +# BR2_PACKAGE_BELR is not set +# BR2_PACKAGE_BOOST is not set +# BR2_PACKAGE_C_CAPNPROTO is not set +# BR2_PACKAGE_CAPNPROTO is not set +# BR2_PACKAGE_CATCH2 is not set +# BR2_PACKAGE_CCTZ is not set +# BR2_PACKAGE_CEREAL is not set +# BR2_PACKAGE_CLANG is not set # BR2_PACKAGE_CMOCKA is not set - -# -# cppcms needs a toolchain w/ C++, NPTL, wchar, dynamic library -# +# BR2_PACKAGE_CPPCMS is not set # BR2_PACKAGE_CRACKLIB is not set - -# -# dawgdic needs a toolchain w/ C++, gcc >= 4.6 -# +# BR2_PACKAGE_DAWGDIC is not set # BR2_PACKAGE_DING_LIBS is not set # BR2_PACKAGE_DOTCONF is not set - -# -# double-conversion needs a toolchain w/ C++ -# - -# -# eigen needs a toolchain w/ C++ -# +# BR2_PACKAGE_DOUBLE_CONVERSION is not set +# BR2_PACKAGE_EIGEN is not set # BR2_PACKAGE_ELFUTILS is not set # BR2_PACKAGE_ELL is not set # BR2_PACKAGE_FFTW is not set - -# -# flann needs a toolchain w/ C++, dynamic library, gcc >= 4.7 -# - -# -# flatbuffers needs a toolchain w/ C++, gcc >= 4.7 -# +# BR2_PACKAGE_FLANN is not set +# BR2_PACKAGE_FLATBUFFERS is not set # BR2_PACKAGE_FLATCC is not set # BR2_PACKAGE_FXDIV is not set # BR2_PACKAGE_GCONF is not set - -# -# gdal needs a toolchain w/ C++, dynamic library, gcc >= 4.7, not binutils bug 27597, threads, wchar -# - -# -# gflags needs a toolchain w/ C++ -# - -# -# gli needs a toolchain w/ C++ -# - -# -# glibmm needs a toolchain w/ C++, wchar, threads, gcc >= 7 -# - -# -# glibmm (2.66.x) needs a toolchain w/ C++, wchar, threads, gcc >= 4.9 -# - -# -# glm needs a toolchain w/ C++ -# +# BR2_PACKAGE_GDAL is not set +# BR2_PACKAGE_GFLAGS is not set +# BR2_PACKAGE_GLI is not set +# BR2_PACKAGE_GLIBMM is not set +# BR2_PACKAGE_GLIBMM2_66 is not set +# BR2_PACKAGE_GLM is not set # BR2_PACKAGE_GMP is not set BR2_PACKAGE_GOBJECT_INTROSPECTION_ARCH_SUPPORTS=y @@ -2418,15 +1766,9 @@ BR2_PACKAGE_GOBJECT_INTROSPECTION_ARCH_SUPPORTS=y # gobject-introspection needs python3 # # BR2_PACKAGE_GSL is not set - -# -# gtest needs a toolchain w/ C++, wchar, threads, gcc >= 5 -# +# BR2_PACKAGE_GTEST is not set # BR2_PACKAGE_GUMBO_PARSER is not set - -# -# highway needs a toolchain w/ C++, gcc >= 7 -# +# BR2_PACKAGE_HIGHWAY is not set BR2_PACKAGE_JEMALLOC_ARCH_SUPPORTS=y # BR2_PACKAGE_JEMALLOC is not set BR2_PACKAGE_LAPACK_ARCH_SUPPORTS=y @@ -2435,10 +1777,7 @@ BR2_PACKAGE_LAPACK_ARCH_SUPPORTS=y # lapack/blas needs a toolchain w/ fortran # BR2_PACKAGE_LIBABSEIL_CPP_ARCH_SUPPORTS=y - -# -# libabseil-cpp needs a toolchain w/ gcc >= 4.9, C++, threads, dynamic library -# +# BR2_PACKAGE_LIBABSEIL_CPP is not set # BR2_PACKAGE_LIBARGTABLE2 is not set BR2_PACKAGE_LIBATOMIC_OPS_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBATOMIC_OPS is not set @@ -2450,16 +1789,10 @@ BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBBYTESIZE is not set # BR2_PACKAGE_LIBCAP is not set # BR2_PACKAGE_LIBCAP_NG is not set - -# -# libcgroup needs a glibc toolchain w/ C++ -# +# BR2_PACKAGE_LIBCGROUP is not set # BR2_PACKAGE_LIBCLC is not set # BR2_PACKAGE_LIBCORRECT is not set - -# -# libcrossguid needs a toolchain w/ C++, gcc >= 4.7 -# +# BR2_PACKAGE_LIBCROSSGUID is not set # BR2_PACKAGE_LIBCSV is not set # BR2_PACKAGE_LIBDAEMON is not set # BR2_PACKAGE_LIBDILL is not set @@ -2472,75 +1805,39 @@ BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS=y # libexecinfo needs a musl or uclibc toolchain w/ dynamic library # # BR2_PACKAGE_LIBFFI is not set - -# -# libfutils needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_LIBFUTILS is not set # BR2_PACKAGE_LIBGEE is not set - -# -# libgeos needs a toolchain w/ C++, wchar, threads not binutils bug 27597 -# +# BR2_PACKAGE_LIBGEOS is not set # BR2_PACKAGE_LIBGLIB2 is not set # BR2_PACKAGE_LIBGLOB is not set - -# -# libical needs a toolchain w/ C++, dynamic library, wchar -# +# BR2_PACKAGE_LIBICAL is not set # BR2_PACKAGE_LIBITE is not set - -# -# libks needs a toolchain w/ C++, NPTL, dynamic library -# - -# -# liblinear needs a toolchain w/ C++ -# - -# -# libloki needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_LIBKS is not set +# BR2_PACKAGE_LIBLINEAR is not set +# BR2_PACKAGE_LIBLOKI is not set # BR2_PACKAGE_LIBNPTH is not set BR2_PACKAGE_LIBNSPR_ARCH_SUPPORT=y # BR2_PACKAGE_LIBNSPR is not set - -# -# libosmium needs a toolchain w/ C++, wchar, threads, gcc >= 4.7 -# +# BR2_PACKAGE_LIBOSMIUM is not set # # libpeas needs python3 # # BR2_PACKAGE_LIBPFM4 is not set - -# -# libplist needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_LIBPLIST is not set # BR2_PACKAGE_LIBPTHREAD_STUBS is not set # BR2_PACKAGE_LIBPTHSEM is not set # BR2_PACKAGE_LIBPWQUALITY is not set # BR2_PACKAGE_LIBQB is not set BR2_PACKAGE_LIBSECCOMP_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBSECCOMP is not set - -# -# libshdata needs a toolchain w/ C++, threads -# - -# -# libsigc++ needs a toolchain w/ C++, gcc >= 7 -# - -# -# libsigc++ (2.x.x) needs a toolchain w/ C++, gcc >= 4.9 -# +# BR2_PACKAGE_LIBSHDATA is not set +# BR2_PACKAGE_LIBSIGC is not set +# BR2_PACKAGE_LIBSIGC2 is not set BR2_PACKAGE_LIBSIGSEGV_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBSIGSEGV is not set # BR2_PACKAGE_LIBSOLV is not set - -# -# libspatialindex needs a toolchain w/ C++, gcc >= 4.7 -# +# BR2_PACKAGE_LIBSPATIALINDEX is not set # BR2_PACKAGE_LIBTALLOC is not set # BR2_PACKAGE_LIBTASN1 is not set # BR2_PACKAGE_LIBTOMMATH is not set @@ -2556,79 +1853,37 @@ BR2_PACKAGE_LIBURCU_ARCH_SUPPORTS=y # BR2_PACKAGE_LIQUID_DSP is not set BR2_PACKAGE_LLVM_ARCH_SUPPORTS=y BR2_PACKAGE_LLVM_TARGET_ARCH="riscv64" - -# -# llvm needs a toolchain w/ wchar, threads, C++, gcc >= 5, dynamic library, host gcc >= 5 -# +# BR2_PACKAGE_LLVM is not set # BR2_PACKAGE_LTTNG_LIBUST is not set # BR2_PACKAGE_MATIO is not set # BR2_PACKAGE_MPC is not set # BR2_PACKAGE_MPDECIMAL is not set # BR2_PACKAGE_MPFR is not set # BR2_PACKAGE_MPIR is not set - -# -# msgpack needs a toolchain w/ C++ -# +# BR2_PACKAGE_MSGPACK is not set # BR2_PACKAGE_NEON_2_SSE is not set # BR2_PACKAGE_ORC is not set # BR2_PACKAGE_P11_KIT is not set BR2_PACKAGE_POCO_ARCH_SUPPORTS=y - -# -# poco needs a toolchain w/ wchar, NPTL, C++, dynamic library, gcc >= 5 w/ C++14 -# +# BR2_PACKAGE_POCO is not set BR2_PACKAGE_HOST_PROTOBUF_ARCH_SUPPORTS=y BR2_PACKAGE_PROTOBUF_ARCH_SUPPORTS=y - -# -# protobuf needs a toolchain w/ C++, threads, dynamic library, gcc >= 4.8 -# - -# -# protobuf-c needs a toolchain w/ C++, threads -# - -# -# protozero needs a toolchain w/ C++, gcc >= 4.7 -# - -# -# qhull needs a toolchain w/ C++, gcc >= 4.4 -# +# BR2_PACKAGE_PROTOBUF is not set +# BR2_PACKAGE_PROTOBUF_C is not set +# BR2_PACKAGE_PROTOZERO is not set +# BR2_PACKAGE_QHULL is not set # BR2_PACKAGE_QLIBC is not set # BR2_PACKAGE_REPROC is not set - -# -# riemann-c-client needs a toolchain w/ C++, threads -# - -# -# shapelib needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_RIEMANN_C_CLIENT is not set +# BR2_PACKAGE_SHAPELIB is not set # BR2_PACKAGE_SKALIBS is not set # BR2_PACKAGE_SPHINXBASE is not set - -# -# tbb needs a glibc or musl toolchain w/ dynamic library, threads, C++ -# +# BR2_PACKAGE_TBB is not set # BR2_PACKAGE_TINYCBOR is not set - -# -# tl-expected needs a toolchain w/ C++, gcc >= 4.8 -# - -# -# uvw needs a toolchain w/ NPTL, dynamic library, C++, gcc >= 7 -# - -# -# volk needs a toolchain w/ C++, NPTL, wchar, dynamic library -# - -# -# xapian needs a toolchain w/ C++ -# +# BR2_PACKAGE_TL_EXPECTED is not set +# BR2_PACKAGE_UVW is not set +# BR2_PACKAGE_VOLK is not set +# BR2_PACKAGE_XAPIAN is not set # # Security @@ -2637,36 +1892,18 @@ BR2_PACKAGE_PROTOBUF_ARCH_SUPPORTS=y # BR2_PACKAGE_LIBSELINUX is not set # BR2_PACKAGE_LIBSEPOL is not set # BR2_PACKAGE_SAFECLIB is not set - -# -# softhsm2 needs a toolchain w/ C++, threads, gcc >= 4.8 and dynamic library support -# +# BR2_PACKAGE_SOFTHSM2 is not set # # Text and terminal handling # # BR2_PACKAGE_AUGEAS is not set - -# -# cli11 needs a toolchain w/ C++, gcc >= 4.8 -# - -# -# docopt-cpp needs a toolchain w/ C++, gcc >= 4.7 -# - -# -# enchant needs a toolchain w/ C++, threads, wchar -# - -# -# fmt needs a toolchain w/ C++, wchar -# +# BR2_PACKAGE_CLI11 is not set +# BR2_PACKAGE_DOCOPT_CPP is not set +# BR2_PACKAGE_ENCHANT is not set +# BR2_PACKAGE_FMT is not set # BR2_PACKAGE_FSTRCMP is not set - -# -# icu needs a toolchain w/ C++, wchar, threads, gcc >= 4.9, host gcc >= 4.9 -# +# BR2_PACKAGE_ICU is not set # BR2_PACKAGE_INIH is not set # BR2_PACKAGE_LIBCLI is not set # BR2_PACKAGE_LIBEDIT is not set @@ -2685,20 +1922,11 @@ BR2_PACKAGE_NCURSES_ADDITIONAL_TERMINFO="" # BR2_PACKAGE_PCRE is not set # BR2_PACKAGE_PCRE2 is not set # BR2_PACKAGE_POPT is not set - -# -# re2 needs a toolchain w/ C++, threads, gcc >= 4.8 -# +# BR2_PACKAGE_RE2 is not set # BR2_PACKAGE_READLINE is not set # BR2_PACKAGE_SLANG is not set - -# -# tclap needs a toolchain w/ C++ -# - -# -# termcolor needs a toolchain w/ C++, gcc >= 4.8 -# +# BR2_PACKAGE_TCLAP is not set +# BR2_PACKAGE_TERMCOLOR is not set # BR2_PACKAGE_UTF8PROC is not set # @@ -2718,10 +1946,7 @@ BR2_PACKAGE_NCURSES_ADDITIONAL_TERMINFO="" # BR2_PACKAGE_AESPIPE is not set # BR2_PACKAGE_BC is not set BR2_PACKAGE_BITCOIN_ARCH_SUPPORTS=y - -# -# bitcoin needs a toolchain w/ C++, threads, wchar -# +# BR2_PACKAGE_BITCOIN is not set # BR2_PACKAGE_COLLECTD is not set # BR2_PACKAGE_COLLECTL is not set @@ -2730,16 +1955,9 @@ BR2_PACKAGE_BITCOIN_ARCH_SUPPORTS=y # # BR2_PACKAGE_EMPTY is not set # BR2_PACKAGE_GITLAB_RUNNER is not set - -# -# gnuradio needs a toolchain w/ C++, NPTL, wchar, dynamic library, gcc >= 8 -# +# BR2_PACKAGE_GNURADIO is not set # BR2_PACKAGE_GOOGLEFONTDIRECTORY is not set -# -# gqrx needs a toolchain w/ C++, threads, wchar, dynamic library, gcc >= 8 -# - # # gqrx needs qt5 # @@ -2748,74 +1966,48 @@ BR2_PACKAGE_BITCOIN_ARCH_SUPPORTS=y # BR2_PACKAGE_LINUX_SYSCALL_SUPPORT is not set # BR2_PACKAGE_MOBILE_BROADBAND_PROVIDER_INFO is not set # BR2_PACKAGE_NETDATA is not set - -# -# proj needs a toolchain w/ C++, gcc >= 4.7, threads, wchar -# +# BR2_PACKAGE_PROJ is not set BR2_PACKAGE_QEMU_ARCH_SUPPORTS_TARGET=y # BR2_PACKAGE_QEMU is not set - -# -# qpdf needs a toolchain w/ C++, gcc >= 5 -# +# BR2_PACKAGE_QPDF is not set # BR2_PACKAGE_RTL_433 is not set # BR2_PACKAGE_SHARED_MIME_INFO is not set - -# -# sunwait needs a toolchain w/ C++ -# - -# -# taskd needs a toolchain w/ C++, wchar, dynamic library -# +# BR2_PACKAGE_SUNWAIT is not set +# BR2_PACKAGE_TASKD is not set # BR2_PACKAGE_XUTIL_UTIL_MACROS is not set BR2_PACKAGE_Z3_ARCH_SUPPORTS=y +# BR2_PACKAGE_Z3 is not set # # Networking applications # - -# -# aircrack-ng needs a toolchain w/ dynamic library, threads, C++ -# +# BR2_PACKAGE_AIRCRACK_NG is not set # BR2_PACKAGE_ALFRED is not set # BR2_PACKAGE_AOETOOLS is not set # BR2_PACKAGE_APACHE is not set # BR2_PACKAGE_ARGUS is not set # BR2_PACKAGE_ARP_SCAN is not set # BR2_PACKAGE_ARPTABLES is not set - -# -# asterisk needs a glibc or uClibc toolchain w/ C++, dynamic library, threads, wchar -# +# BR2_PACKAGE_ASTERISK is not set # BR2_PACKAGE_ATFTP is not set # BR2_PACKAGE_AVAHI is not set # BR2_PACKAGE_AXEL is not set # BR2_PACKAGE_BABELD is not set # BR2_PACKAGE_BANDWIDTHD is not set # BR2_PACKAGE_BATCTL is not set - -# -# bcusdk needs a toolchain w/ C++ -# +# BR2_PACKAGE_BCUSDK is not set # BR2_PACKAGE_BIND is not set # BR2_PACKAGE_BIRD is not set # BR2_PACKAGE_BLUEZ5_UTILS is not set # BR2_PACKAGE_BMON is not set # BR2_PACKAGE_BMX7 is not set - -# -# boinc needs a toolchain w/ dynamic library, C++, threads, gcc >= 4.8 -# +# BR2_PACKAGE_BOINC is not set # BR2_PACKAGE_BRCM_PATCHRAM_PLUS is not set # BR2_PACKAGE_BRIDGE_UTILS is not set # BR2_PACKAGE_BWM_NG is not set # BR2_PACKAGE_C_ICAP is not set # BR2_PACKAGE_CAN_UTILS is not set - -# -# cannelloni needs a toolchain w/ C++, threads, dynamic library, gcc >= 4.8 -# +# BR2_PACKAGE_CANNELLONI is not set # BR2_PACKAGE_CASYNC is not set # BR2_PACKAGE_CFM is not set # BR2_PACKAGE_CHRONY is not set @@ -2828,18 +2020,8 @@ BR2_PACKAGE_Z3_ARCH_SUPPORTS=y # BR2_PACKAGE_CONNTRACK_TOOLS is not set # BR2_PACKAGE_CORKSCREW is not set # BR2_PACKAGE_CRDA is not set - -# -# ctorrent needs a toolchain w/ C++ -# - -# -# cups needs a toolchain w/ C++, threads -# - -# -# cups-filters needs a toolchain w/ wchar, C++, threads and dynamic library, gcc >= 5 -# +# BR2_PACKAGE_CTORRENT is not set +# BR2_PACKAGE_CUPS is not set # BR2_PACKAGE_DANTE is not set # BR2_PACKAGE_DARKHTTPD is not set # BR2_PACKAGE_DEHYDRATED is not set @@ -2861,47 +2043,26 @@ BR2_PACKAGE_Z3_ARCH_SUPPORTS=y # BR2_PACKAGE_FLANNEL is not set # BR2_PACKAGE_FPING is not set # BR2_PACKAGE_FREERADIUS_SERVER is not set - -# -# freeswitch needs a toolchain w/ C++, dynamic library, threads, wchar -# +# BR2_PACKAGE_FREESWITCH is not set # BR2_PACKAGE_FRR is not set - -# -# gerbera needs a toolchain w/ C++, dynamic library, threads, wchar, gcc >= 8 -# +# BR2_PACKAGE_GERBERA is not set # BR2_PACKAGE_GESFTPSERVER is not set - -# -# gloox needs a toolchain w/ C++ -# +# BR2_PACKAGE_GLOOX is not set # BR2_PACKAGE_GLORYTUN is not set # # gupnp-tools needs libgtk3 # - -# -# hans needs a toolchain w/ C++ -# +# BR2_PACKAGE_HANS is not set BR2_PACKAGE_HAPROXY_ARCH_SUPPORTS=y # BR2_PACKAGE_HAPROXY is not set # BR2_PACKAGE_HIAWATHA is not set # BR2_PACKAGE_HOSTAPD is not set # BR2_PACKAGE_HTPDATE is not set # BR2_PACKAGE_HTTPING is not set - -# -# i2pd needs a toolchain w/ C++, NPTL, wchar -# - -# -# ibrdtn-tools needs a toolchain w/ C++, threads -# - -# -# ibrdtnd needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_I2PD is not set +# BR2_PACKAGE_IBRDTN_TOOLS is not set +# BR2_PACKAGE_IBRDTND is not set # BR2_PACKAGE_IFMETRIC is not set # BR2_PACKAGE_IFTOP is not set BR2_PACKAGE_IFUPDOWN_SCRIPTS=y @@ -2910,10 +2071,7 @@ BR2_PACKAGE_IFUPDOWN_SCRIPTS=y # BR2_PACKAGE_IGMPPROXY is not set # BR2_PACKAGE_INADYN is not set # BR2_PACKAGE_IODINE is not set - -# -# iperf needs a toolchain w/ C++ -# +# BR2_PACKAGE_IPERF is not set # BR2_PACKAGE_IPERF3 is not set # BR2_PACKAGE_IPROUTE2 is not set # BR2_PACKAGE_IPSET is not set @@ -2925,28 +2083,16 @@ BR2_PACKAGE_IFUPDOWN_SCRIPTS=y # BR2_PACKAGE_IWD is not set # BR2_PACKAGE_JANUS_GATEWAY is not set # BR2_PACKAGE_KEEPALIVED is not set - -# -# kismet needs a toolchain w/ threads, C++, gcc >= 5 -# +# BR2_PACKAGE_KISMET is not set # BR2_PACKAGE_KNOCK is not set # BR2_PACKAGE_KSMBD_TOOLS is not set # BR2_PACKAGE_LEAFNODE2 is not set # BR2_PACKAGE_LFT is not set - -# -# lftp requires a toolchain w/ C++, wchar -# +# BR2_PACKAGE_LFTP is not set # BR2_PACKAGE_LIGHTTPD is not set - -# -# linknx needs a toolchain w/ C++ -# +# BR2_PACKAGE_LINKNX is not set # BR2_PACKAGE_LINKS is not set - -# -# linphone needs a toolchain w/ threads, C++, dynamic library, wchar, gcc >= 5 -# +# BR2_PACKAGE_LINPHONE is not set # BR2_PACKAGE_LINUX_ZIGBEE is not set # BR2_PACKAGE_LINUXPTP is not set # BR2_PACKAGE_LLDPD is not set @@ -2961,14 +2107,8 @@ BR2_PACKAGE_IFUPDOWN_SCRIPTS=y # BR2_PACKAGE_MJPG_STREAMER is not set # BR2_PACKAGE_MODEM_MANAGER is not set BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y - -# -# mongrel2 needs a uClibc or glibc toolchain w/ C++, threads, dynamic library -# - -# -# mosh needs a toolchain w/ C++, threads, dynamic library, wchar, gcc >= 4.8 -# +# BR2_PACKAGE_MONGREL2 is not set +# BR2_PACKAGE_MOSH is not set # BR2_PACKAGE_MOSQUITTO is not set # BR2_PACKAGE_MROUTED is not set # BR2_PACKAGE_MRP is not set @@ -2991,14 +2131,8 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # BR2_PACKAGE_NGINX is not set # BR2_PACKAGE_NGIRCD is not set # BR2_PACKAGE_NGREP is not set - -# -# nload needs a toolchain w/ C++ -# - -# -# nmap-nmap needs a toolchain w/ C++, threads -# +# BR2_PACKAGE_NLOAD is not set +# BR2_PACKAGE_NMAP is not set # BR2_PACKAGE_NOIP is not set # BR2_PACKAGE_NTP is not set # BR2_PACKAGE_NTPSEC is not set @@ -3043,10 +2177,7 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # BR2_PACKAGE_RPCBIND is not set # BR2_PACKAGE_RSH_REDONE is not set # BR2_PACKAGE_RSYNC is not set - -# -# rtorrent needs a toolchain w/ C++, threads, wchar, gcc >= 4.9 -# +# BR2_PACKAGE_RTORRENT is not set # BR2_PACKAGE_RTPTOOLS is not set # @@ -3055,16 +2186,10 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # BR2_PACKAGE_S6_DNS is not set # BR2_PACKAGE_S6_NETWORKING is not set # BR2_PACKAGE_SAMBA4 is not set - -# -# sconeserver needs a toolchain with dynamic library, C++, NPTL -# +# BR2_PACKAGE_SCONESERVER is not set # BR2_PACKAGE_SER2NET is not set # BR2_PACKAGE_SHADOWSOCKS_LIBEV is not set - -# -# shairport-sync needs a toolchain w/ C++, NPTL -# +# BR2_PACKAGE_SHAIRPORT_SYNC is not set # BR2_PACKAGE_SHELLINABOX is not set # BR2_PACKAGE_SMCROUTE is not set # BR2_PACKAGE_SNGREP is not set @@ -3074,10 +2199,7 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # BR2_PACKAGE_SOFTETHER is not set # BR2_PACKAGE_SPAWN_FCGI is not set # BR2_PACKAGE_SPICE_PROTOCOL is not set - -# -# squid needs a toolchain w/ C++, threads, gcc >= 4.8 not affected by bug 64735 -# +# BR2_PACKAGE_SQUID is not set # BR2_PACKAGE_SSDP_RESPONDER is not set # BR2_PACKAGE_SSHGUARD is not set # BR2_PACKAGE_SSHPASS is not set @@ -3093,10 +2215,7 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # BR2_PACKAGE_TINYSSH is not set # BR2_PACKAGE_TOR is not set # BR2_PACKAGE_TRACEROUTE is not set - -# -# transmission needs a toolchain w/ dynamic library, threads, C++, gcc >= 7 -# +# BR2_PACKAGE_TRANSMISSION is not set # BR2_PACKAGE_TUNCTL is not set # BR2_PACKAGE_TVHEADEND is not set # BR2_PACKAGE_UACME is not set @@ -3110,10 +2229,7 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # BR2_PACKAGE_USHARE is not set # BR2_PACKAGE_USSP_PUSH is not set # BR2_PACKAGE_VDE2 is not set - -# -# vdr needs a toolchain w/ C++, dynamic library, NPTL, wchar, headers >= 3.9 -# +# BR2_PACKAGE_VDR is not set # BR2_PACKAGE_VNSTAT is not set # BR2_PACKAGE_VPNC is not set # BR2_PACKAGE_VSFTPD is not set @@ -3122,24 +2238,15 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # BR2_PACKAGE_WIREGUARD_TOOLS is not set # BR2_PACKAGE_WIRELESS_REGDB is not set # BR2_PACKAGE_WIRELESS_TOOLS is not set - -# -# wireshark needs a toolchain w/ wchar, threads, dynamic library, C++ -# +# BR2_PACKAGE_WIRESHARK is not set # BR2_PACKAGE_WPA_SUPPLICANT is not set # BR2_PACKAGE_WPAN_TOOLS is not set # BR2_PACKAGE_XINETD is not set # BR2_PACKAGE_XL2TP is not set # BR2_PACKAGE_XTABLES_ADDONS is not set # BR2_PACKAGE_ZABBIX is not set - -# -# zeek needs a toolchain w/ C++, wchar, threads, dynamic library, gcc >= 7, host gcc >= 7 -# - -# -# znc needs a toolchain w/ C++, dynamic library, gcc >= 4.8, threads -# +# BR2_PACKAGE_ZEEK is not set +# BR2_PACKAGE_ZNC is not set # # Package managers @@ -3199,10 +2306,7 @@ BR2_PACKAGE_MONGREL2_LIBC_SUPPORTS=y # # Security # - -# -# apparmor needs a toolchain w/ headers >= 3.16, threads, C++ -# +# BR2_PACKAGE_APPARMOR is not set # BR2_PACKAGE_CHECKPOLICY is not set # BR2_PACKAGE_IMA_EVM_UTILS is not set # BR2_PACKAGE_OPTEE_CLIENT is not set @@ -3281,10 +2385,7 @@ BR2_PACKAGE_GNUPG2_DEPENDS=y # BR2_PACKAGE_CRUN is not set # BR2_PACKAGE_DAEMON is not set # BR2_PACKAGE_DC3DD is not set - -# -# ddrescue needs a toolchain w/ C++ -# +# BR2_PACKAGE_DDRESCUE is not set # BR2_PACKAGE_DOCKER_CLI is not set # @@ -3327,10 +2428,7 @@ BR2_PACKAGE_INITSCRIPTS=y # netifrc needs openrc as init system # # BR2_PACKAGE_NUMACTL is not set - -# -# nut needs a toolchain w/ C++ -# +# BR2_PACKAGE_NUT is not set # # pamtester depends on linux-pam From 9ec2bfd0523dc54aba06b999b6cc2fa7a8211e34 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Wed, 27 Sep 2023 12:00:47 -0500 Subject: [PATCH 06/10] Fixed sutble RAS bug when the stack size was not a power of 2. --- src/ifu/bpred/RASPredictor.sv | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/ifu/bpred/RASPredictor.sv b/src/ifu/bpred/RASPredictor.sv index 5dd3cf7b2..445bac622 100644 --- a/src/ifu/bpred/RASPredictor.sv +++ b/src/ifu/bpred/RASPredictor.sv @@ -27,8 +27,7 @@ // and limitations under the License. //////////////////////////////////////////////////////////////////////////////////////////////// -module RASPredictor import cvw::*; #(parameter cvw_t P, - parameter StackSize = 16 )( +module RASPredictor import cvw::*; #(parameter cvw_t P)( input logic clk, input logic reset, input logic StallF, StallD, StallE, StallM, FlushD, FlushE, FlushM, @@ -41,10 +40,10 @@ module RASPredictor import cvw::*; #(parameter cvw_t P, ); logic CounterEn; - localparam Depth = $clog2(StackSize); + localparam Depth = $clog2(P.RAS_SIZE); logic [Depth-1:0] NextPtr, Ptr, P1, M1, IncDecPtr; - logic [StackSize-1:0] [P.XLEN-1:0] memory; + logic [P.RAS_SIZE-1:0] [P.XLEN-1:0] memory; integer index; logic PopF; @@ -76,14 +75,17 @@ module RASPredictor import cvw::*; #(parameter cvw_t P, assign P1 = 1; assign M1 = '1; // -1 mux2 #(Depth) PtrMux(P1, M1, DecrementPtr, IncDecPtr); - assign NextPtr = Ptr + IncDecPtr; + logic [Depth-1:0] Sum; + assign Sum = Ptr + IncDecPtr; + assign NextPtr = Sum == P.RAS_SIZE[Depth-1:0] ? 0 : Sum; // wrap back around if our stack is not a power of 2 + //assign NextPtr = Ptr + IncDecPtr; flopenr #(Depth) PTR(clk, reset, CounterEn, NextPtr, Ptr); // RAS must be reset. always_ff @ (posedge clk) begin if(reset) begin - for(index=0; index Date: Wed, 27 Sep 2023 12:25:05 -0500 Subject: [PATCH 07/10] Actually fixed non-power of 2 issue with RAS. Added RAS swapping to branch predictor scripts and configurations. --- bin/parseTest.py | 13 +++++++--- config/buildroot/config.vh | 1 + config/fpga/config.vh | 1 + config/rv32e/config.vh | 1 + config/rv32gc/config.vh | 6 +++++ config/rv32i/config.vh | 1 + config/rv32imc/config.vh | 1 + config/rv64fpquad/config.vh | 1 + config/rv64gc/config.vh | 3 ++- config/rv64i/config.vh | 1 + config/shared/parameter-defs.vh | 1 + sim/bpred-sim.py | 46 ++++++++++++++++++++++++--------- src/cvw.sv | 1 + src/ifu/bpred/RASPredictor.sv | 5 +++- 14 files changed, 64 insertions(+), 18 deletions(-) diff --git a/bin/parseTest.py b/bin/parseTest.py index ba3309aff..c24fbe3fe 100755 --- a/bin/parseTest.py +++ b/bin/parseTest.py @@ -32,6 +32,10 @@ import math import numpy as np import argparse +RefData = [('twobitCModel6', 'twobitCModel', 64, 9.65280765420711), ('twobitCModel8', 'twobitCModel', 256, 8.75120245829945), ('twobitCModel10', 'twobitCModel', 1024, 8.1318382397263), + ('twobitCModel12', 'twobitCModel', 4096, 7.53026646633342), ('twobitCModel14', 'twobitCModel', 16384, 6.07679338544009), ('twobitCModel16', 'twobitCModel', 65536, 6.07679338544009), + ('gshareCModel6', 'gshareCModel', 64, 10.6602835418646), ('gshareCModel8', 'gshareCModel', 256, 8.38384710559667), ('gshareCModel10', 'gshareCModel', 1024, 6.36847432155534), + ('gshareCModel12', 'gshareCModel', 4096, 3.91108491151983), ('gshareCModel14', 'gshareCModel', 16384, 2.83926519215395), ('gshareCModel16', 'gshareCModel', 65536, .60213659066941)] def ParseBranchListFile(path): '''Take the path to the list of Questa Sim log files containing the performance counters outputs. File @@ -65,7 +69,7 @@ def ProcessFile(fileName): HPMClist = { } elif(len(lineToken) > 4 and lineToken[1][0:3] == 'Cnt'): countToken = line.split('=')[1].split() - value = int(countToken[0]) + value = int(countToken[0]) if countToken[0] != 'x' else 0 name = ' '.join(countToken[1:]) HPMClist[name] = value elif ('is done' in line): @@ -111,7 +115,7 @@ def ComputeGeometricAverage(benchmarks): benchmarks.append(('Mean', '', AllAve)) def GenerateName(predictorType, predictorParams): - if(predictorType == 'gshare' or predictorType == 'twobit'): + if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class'): return predictorType + predictorParams[0] elif(predictorParams == 'local'): return predictorType + predictorParams[0] + '_' + predictorParams[1] @@ -120,7 +124,7 @@ def GenerateName(predictorType, predictorParams): sys.exit(-1) def ComputePredNumEntries(predictorType, predictorParams): - if(predictorType == 'gshare' or predictorType == 'twobit'): + if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class'): return 2**int(predictorParams[0]) elif(predictorParams == 'local'): return 2**int(predictorParams[0]) * int(predictorParams[1]) + 2**int(predictorParams[1]) @@ -286,7 +290,7 @@ def ReportAsGraph(benchmarkDict, bar): 'ClassMPR': 'Class Misprediction'} if(args.summary): markers = ['x', '.', '+', '*', '^', 'o', ',', 's'] - colors = ['black', 'blue', 'dodgerblue', 'turquoise', 'lightsteelblue', 'gray', 'black', 'blue'] + colors = ['blue', 'black', 'dodgerblue', 'gray', 'lightsteelblue', 'turquoise', 'black', 'blue'] temp = benchmarkDict['Mean'] # the benchmarkDict['Mean'] contains sequencies of results for multiple @@ -429,6 +433,7 @@ performanceCounterList = BuildDataBase(predictorLogs) # builds a databas benchmarkFirstList = ReorderDataBase(performanceCounterList) # reorder first by benchmark then trace benchmarkDict = ExtractSelectedData(benchmarkFirstList) # filters to just the desired performance counter metric +if(args.reference): benchmarkDict['Mean'].extend(RefData) #print(benchmarkDict['Mean']) #print(benchmarkDict['aha-mont64Speed']) #print(benchmarkDict) diff --git a/config/buildroot/config.vh b/config/buildroot/config.vh index 38960c735..79ee99f3c 100644 --- a/config/buildroot/config.vh +++ b/config/buildroot/config.vh @@ -142,6 +142,7 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 1; diff --git a/config/fpga/config.vh b/config/fpga/config.vh index 7e582fabb..27903d0be 100644 --- a/config/fpga/config.vh +++ b/config/fpga/config.vh @@ -156,6 +156,7 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_NUM_LHR = 32'd6; localparam BPRED_SIZE = 32'd12; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 1; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/rv32e/config.vh b/config/rv32e/config.vh index e1cbdab0f..c67e71c13 100644 --- a/config/rv32e/config.vh +++ b/config/rv32e/config.vh @@ -144,6 +144,7 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 0; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/rv32gc/config.vh b/config/rv32gc/config.vh index 46d3ed22a..de966b1f2 100644 --- a/config/rv32gc/config.vh +++ b/config/rv32gc/config.vh @@ -150,7 +150,13 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_SIZE = 32'd10; `endif localparam BPRED_NUM_LHR = 32'd6; +`ifdef BTB_OVERRIDE +localparam BTB_SIZE = `BTB_SIZE; +localparam RAS_SIZE = `RAS_SIZE; +`else localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; +`endif localparam SVADU_SUPPORTED = 1; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/rv32i/config.vh b/config/rv32i/config.vh index e1c5a6a5d..a31e034df 100644 --- a/config/rv32i/config.vh +++ b/config/rv32i/config.vh @@ -144,6 +144,7 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 0; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/rv32imc/config.vh b/config/rv32imc/config.vh index a9123cbb4..61eea7325 100644 --- a/config/rv32imc/config.vh +++ b/config/rv32imc/config.vh @@ -143,6 +143,7 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 0; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/rv64fpquad/config.vh b/config/rv64fpquad/config.vh index 2533dbc21..d8bf3e6fc 100644 --- a/config/rv64fpquad/config.vh +++ b/config/rv64fpquad/config.vh @@ -146,6 +146,7 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 0; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/rv64gc/config.vh b/config/rv64gc/config.vh index 16e50b899..36d99020e 100644 --- a/config/rv64gc/config.vh +++ b/config/rv64gc/config.vh @@ -147,8 +147,9 @@ localparam PLIC_SDC_ID = 32'd9; localparam BPRED_SUPPORTED = 1; localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_NUM_LHR = 32'd6; -localparam BPRED_SIZE = 32'd10; +localparam BPRED_SIZE = 32'd6; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 1; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/rv64i/config.vh b/config/rv64i/config.vh index c27f7faf0..6add96e78 100644 --- a/config/rv64i/config.vh +++ b/config/rv64i/config.vh @@ -146,6 +146,7 @@ localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BAS localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; +localparam RAS_SIZE = 32'd16; localparam SVADU_SUPPORTED = 0; localparam ZMMUL_SUPPORTED = 0; diff --git a/config/shared/parameter-defs.vh b/config/shared/parameter-defs.vh index 340668466..4921f6a3d 100644 --- a/config/shared/parameter-defs.vh +++ b/config/shared/parameter-defs.vh @@ -89,6 +89,7 @@ localparam cvw_t P = '{ BPRED_SIZE : BPRED_SIZE, BPRED_NUM_LHR : BPRED_NUM_LHR, BTB_SIZE : BTB_SIZE, + RAS_SIZE : RAS_SIZE, RADIX : RADIX, DIVCOPIES : DIVCOPIES, ZBA_SUPPORTED : ZBA_SUPPORTED, diff --git a/sim/bpred-sim.py b/sim/bpred-sim.py index 4ec9324a3..9a59e8866 100755 --- a/sim/bpred-sim.py +++ b/sim/bpred-sim.py @@ -46,19 +46,41 @@ configs = [ ) ] -bpdSize = [6, 8, 10, 12, 14, 16] -bpdType = ['twobit', 'gshare', 'global', 'gshare_basic', 'global_basic', 'local_basic'] -for CurrBPType in bpdType: - for CurrBPSize in bpdSize: - name = CurrBPType+str(CurrBPSize) - configOptions = "+define+INSTR_CLASS_PRED=0 +define+BPRED_OVERRIDE +define+BPRED_TYPE=" + str(bpdType.index(CurrBPType)) + "+define+BPRED_SIZE=" + str(CurrBPSize) - tc = TestCase( - name=name, - variant="rv32gc", - cmd="vsim > {} -c < {} -c < {} -c < {} -c <= P.RAS_SIZE[Depth-1:0] ? 0 : Sum; // wrap back around if our stack is not a power of 2 + else + assign NextPtr = Sum; //assign NextPtr = Ptr + IncDecPtr; flopenr #(Depth) PTR(clk, reset, CounterEn, NextPtr, Ptr); From 9ae6261e5c7b358cf36e2ea93a9d23f2b7fcda36 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Wed, 27 Sep 2023 13:56:51 -0500 Subject: [PATCH 08/10] Completed branch predictor benchmarking. --- bin/parseTest.py | 9 +++-- sim/bp-results/branch-list.txt | 12 +++++++ sim/bp-results/btb-list.txt | 6 ++++ sim/bp-results/class-list.txt | 6 ++++ sim/bp-results/ras-list.txt | 5 +++ sim/wave.do | 64 +++++++++++++++++++--------------- 6 files changed, 71 insertions(+), 31 deletions(-) create mode 100644 sim/bp-results/branch-list.txt create mode 100644 sim/bp-results/btb-list.txt create mode 100644 sim/bp-results/class-list.txt create mode 100644 sim/bp-results/ras-list.txt diff --git a/bin/parseTest.py b/bin/parseTest.py index c24fbe3fe..bb6d2871e 100755 --- a/bin/parseTest.py +++ b/bin/parseTest.py @@ -109,13 +109,14 @@ def ComputeGeometricAverage(benchmarks): index = 0 for (testName, opt, HPMCList) in benchmarks: #print(HPMCList) - Product *= HPMCList[field] + value = HPMCList[field] + if(value != 0): Product *= value # if that value is 0 exclude from mean because it destories the geo mean index += 1 AllAve[field] = Product ** (1.0/index) benchmarks.append(('Mean', '', AllAve)) def GenerateName(predictorType, predictorParams): - if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class'): + if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class' or predictorType == 'ras'): return predictorType + predictorParams[0] elif(predictorParams == 'local'): return predictorType + predictorParams[0] + '_' + predictorParams[1] @@ -126,6 +127,8 @@ def GenerateName(predictorType, predictorParams): def ComputePredNumEntries(predictorType, predictorParams): if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class'): return 2**int(predictorParams[0]) + elif(predictorType == 'ras'): + return int(predictorParams[0]) elif(predictorParams == 'local'): return 2**int(predictorParams[0]) * int(predictorParams[1]) + 2**int(predictorParams[1]) else: @@ -290,7 +293,7 @@ def ReportAsGraph(benchmarkDict, bar): 'ClassMPR': 'Class Misprediction'} if(args.summary): markers = ['x', '.', '+', '*', '^', 'o', ',', 's'] - colors = ['blue', 'black', 'dodgerblue', 'gray', 'lightsteelblue', 'turquoise', 'black', 'blue'] + colors = ['blue', 'black', 'gray', 'dodgerblue', 'lightsteelblue', 'turquoise', 'black', 'blue'] temp = benchmarkDict['Mean'] # the benchmarkDict['Mean'] contains sequencies of results for multiple diff --git a/sim/bp-results/branch-list.txt b/sim/bp-results/branch-list.txt new file mode 100644 index 000000000..c241610d3 --- /dev/null +++ b/sim/bp-results/branch-list.txt @@ -0,0 +1,12 @@ +gshare6.log gshare 6 +gshare8.log gshare 8 +gshare10.log gshare 10 +gshare12.log gshare 12 +gshare14.log gshare 14 +gshare16.log gshare 16 +twobit6.log twobit 6 +twobit8.log twobit 8 +twobit10.log twobit 10 +twobit12.log twobit 12 +twobit14.log twobit 14 +twobit16.log twobit 16 diff --git a/sim/bp-results/btb-list.txt b/sim/bp-results/btb-list.txt new file mode 100644 index 000000000..741efdf24 --- /dev/null +++ b/sim/bp-results/btb-list.txt @@ -0,0 +1,6 @@ +btb6.log btb 6 +btb8.log btb 8 +btb10.log btb 10 +btb12.log btb 12 +btb14.log btb 14 +btb16.log btb 16 diff --git a/sim/bp-results/class-list.txt b/sim/bp-results/class-list.txt new file mode 100644 index 000000000..0d24aa6ee --- /dev/null +++ b/sim/bp-results/class-list.txt @@ -0,0 +1,6 @@ +class6.log class 6 +class8.log class 8 +class10.log class 10 +class12.log class 12 +class14.log class 14 +class16.log class 16 diff --git a/sim/bp-results/ras-list.txt b/sim/bp-results/ras-list.txt new file mode 100644 index 000000000..b3e273a3d --- /dev/null +++ b/sim/bp-results/ras-list.txt @@ -0,0 +1,5 @@ +ras3.log ras 3 +ras4.log ras 4 +ras6.log ras 6 +ras10.log ras 10 +ras16.log ras 16 diff --git a/sim/wave.do b/sim/wave.do index 62ba0108f..20d383bd9 100644 --- a/sim/wave.do +++ b/sim/wave.do @@ -299,7 +299,15 @@ add wave -noupdate -group {WriteBack stage} /testbench/InstrW add wave -noupdate -group {WriteBack stage} /testbench/InstrWName add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} /testbench/dut/core/ifu/bpred/bpred/Predictor/DirPredictor/GHRM add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} -label PHT /testbench/dut/core/ifu/bpred/bpred/Predictor/DirPredictor/PHT/mem -add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} -divider {class check} +add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[5]} +add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[4]} +add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[3]} +add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[2]} +add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[1]} +add wave -noupdate -expand -group Bpred -expand -group {branch update selection inputs} {/testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory[0]} +add wave -noupdate -expand -group Bpred -expand -group RAS -expand /testbench/dut/core/ifu/bpred/bpred/RASPredictor/memory +add wave -noupdate -expand -group Bpred -expand -group RAS /testbench/dut/core/ifu/bpred/bpred/RASPredictor/Ptr +add wave -noupdate -expand -group Bpred -divider {class check} add wave -noupdate -expand -group Bpred -expand -group prediction /testbench/dut/core/ifu/bpred/bpred/RASPCF add wave -noupdate -expand -group Bpred -expand -group prediction -expand -group ex /testbench/dut/core/ifu/bpred/bpred/PCSrcE add wave -noupdate -group {PCNext Generation} /testbench/dut/core/ifu/PCNextF @@ -578,31 +586,31 @@ add wave -noupdate -group ifu -group itlb -expand -group key19 {/testbench/dut/c add wave -noupdate -group ifu -group itlb -expand -group key19 {/testbench/dut/core/ifu/immu/immu/tlb/tlb/tlbcam/camlines[19]/Key1} add wave -noupdate -group ifu -group itlb -expand -group key19 {/testbench/dut/core/ifu/immu/immu/tlb/tlb/tlbcam/camlines[19]/Query0} add wave -noupdate -group ifu -group itlb -expand -group key19 {/testbench/dut/core/ifu/immu/immu/tlb/tlb/tlbcam/camlines[19]/Query1} -add wave -noupdate -expand -group {Performance Counters} -label MCYCLE -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[0]} -add wave -noupdate -expand -group {Performance Counters} -label MINSTRET -radix hexadecimal {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[2]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label Branch -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[3]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label {BP Dir Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[7]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label {Jump (Not Return)} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[4]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label Return -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[5]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label {BP Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[6]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label {BTA Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[8]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label {RAS Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[9]} -add wave -noupdate -expand -group {Performance Counters} -expand -group BP -label {BP CLASS WRONG} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[10]} -add wave -noupdate -expand -group {Performance Counters} -group ICACHE -label {I Cache Access} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[16]} -add wave -noupdate -expand -group {Performance Counters} -group ICACHE -label {I Cache Miss} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[17]} -add wave -noupdate -expand -group {Performance Counters} -group ICACHE -label {I Cache Miss Cycles} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[18]} -add wave -noupdate -expand -group {Performance Counters} -group DCACHE -label {Load Stall} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[11]} -add wave -noupdate -expand -group {Performance Counters} -group DCACHE -label {Store Stall} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[12]} -add wave -noupdate -expand -group {Performance Counters} -group DCACHE -label {DCACHE MISS} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[14]} -add wave -noupdate -expand -group {Performance Counters} -group DCACHE -label {DCACHE ACCESS} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[13]} -add wave -noupdate -expand -group {Performance Counters} -group DCACHE -label {D Cache Miss Cycles} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[15]} -add wave -noupdate -expand -group {Performance Counters} -group Privileged -label {CSR Write} {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[19]} -add wave -noupdate -expand -group {Performance Counters} -group Privileged -label Fence.I {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[20]} -add wave -noupdate -expand -group {Performance Counters} -group Privileged -label sfence.VMA {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[21]} -add wave -noupdate -expand -group {Performance Counters} -group Privileged -label Interrupt {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[22]} -add wave -noupdate -expand -group {Performance Counters} -group Privileged -label Exception {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[23]} -add wave -noupdate -expand -group {Performance Counters} -label {FDiv or IDiv Cycles} {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[24]} -add wave -noupdate -expand -group {Performance Counters} /testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW +add wave -noupdate -group {Performance Counters} -label MCYCLE -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[0]} +add wave -noupdate -group {Performance Counters} -label MINSTRET -radix hexadecimal {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[2]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label Branch -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[3]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label {BP Dir Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[7]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label {Jump (Not Return)} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[4]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label Return -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[5]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label {BP Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[6]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label {BTA Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[8]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label {RAS Wrong} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[9]} +add wave -noupdate -group {Performance Counters} -expand -group BP -label {BP CLASS WRONG} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[10]} +add wave -noupdate -group {Performance Counters} -group ICACHE -label {I Cache Access} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[16]} +add wave -noupdate -group {Performance Counters} -group ICACHE -label {I Cache Miss} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[17]} +add wave -noupdate -group {Performance Counters} -group ICACHE -label {I Cache Miss Cycles} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[18]} +add wave -noupdate -group {Performance Counters} -group DCACHE -label {Load Stall} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[11]} +add wave -noupdate -group {Performance Counters} -group DCACHE -label {Store Stall} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[12]} +add wave -noupdate -group {Performance Counters} -group DCACHE -label {DCACHE MISS} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[14]} +add wave -noupdate -group {Performance Counters} -group DCACHE -label {DCACHE ACCESS} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[13]} +add wave -noupdate -group {Performance Counters} -group DCACHE -label {D Cache Miss Cycles} -radix unsigned {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[15]} +add wave -noupdate -group {Performance Counters} -group Privileged -label {CSR Write} {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[19]} +add wave -noupdate -group {Performance Counters} -group Privileged -label Fence.I {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[20]} +add wave -noupdate -group {Performance Counters} -group Privileged -label sfence.VMA {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[21]} +add wave -noupdate -group {Performance Counters} -group Privileged -label Interrupt {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[22]} +add wave -noupdate -group {Performance Counters} -group Privileged -label Exception {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[23]} +add wave -noupdate -group {Performance Counters} -label {FDiv or IDiv Cycles} {/testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW[24]} +add wave -noupdate -group {Performance Counters} /testbench/dut/core/priv/priv/csr/counters/counters/HPMCOUNTER_REGW add wave -noupdate -group {ifu } -color Gold /testbench/dut/core/ifu/bus/icache/ahbcacheinterface/AHBBuscachefsm/CurrState add wave -noupdate -group {ifu } /testbench/dut/core/ifu/bus/icache/ahbcacheinterface/AHBBuscachefsm/HREADY add wave -noupdate -group {ifu } /testbench/dut/core/ifu/bus/icache/ahbcacheinterface/FetchBuffer @@ -677,7 +685,7 @@ add wave -noupdate /testbench/dut/core/fpu/fpu/fctrl/IllegalFPUInstrD add wave -noupdate /testbench/dut/core/fpu/fpu/fctrl/STATUS_FS add wave -noupdate /testbench/dut/core/priv/priv/csr/csrsr/STATUS_FS_INT TreeUpdate [SetDefaultTree] -WaveRestoreCursors {{Cursor 4} {172636 ns} 1} {{Cursor 4} {5101 ns} 0} {{Cursor 3} {152766 ns} 1} +WaveRestoreCursors {{Cursor 4} {172636 ns} 1} {{Cursor 4} {111958 ns} 0} {{Cursor 3} {152766 ns} 1} quietly wave cursor active 2 configure wave -namecolwidth 250 configure wave -valuecolwidth 194 @@ -693,4 +701,4 @@ configure wave -griddelta 40 configure wave -timeline 0 configure wave -timelineunits ns update -WaveRestoreZoom {4326 ns} {6929 ns} +WaveRestoreZoom {37879604 ns} {38203328 ns} From 293fa17eeed9385eea2a6d66669f272cc25eb72c Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Wed, 27 Sep 2023 13:57:40 -0500 Subject: [PATCH 09/10] Renamed parseTest.py to parseHPMC.py --- bin/parseHPMC.py | 624 +++++++++++++++++++++++++++++------------------ bin/parseTest.py | 470 ----------------------------------- 2 files changed, 385 insertions(+), 709 deletions(-) delete mode 100755 bin/parseTest.py diff --git a/bin/parseHPMC.py b/bin/parseHPMC.py index 8bf98ef5a..bb6d2871e 100755 --- a/bin/parseHPMC.py +++ b/bin/parseHPMC.py @@ -1,8 +1,8 @@ #!/usr/bin/python3 ########################################### -## Written: Ross Thompson ross1728@gmail.com -## Created: 4 Jan 2022 +## Written: Rose Thompson ross1728@gmail.com +## Created: 20 September 2023 ## Modified: ## ## Purpose: Parses the performance counters from a modelsim trace. @@ -28,111 +28,30 @@ import os import sys import matplotlib.pyplot as plt -import re +import math +import numpy as np +import argparse -#RefData={'twobitCModel' :(['6', '8', '10', '12', '14', '16'], -# [11.0680836450622, 8.53864970807778, 7.59565430177984, 6.38741598498948, 5.83662961500838, 5.83662961500838]), -# 'gshareCModel' : (['6', '8', '10', '12', '14', '16'], -# [14.5859173702079, 12.3634674403619, 10.5806018170154, 8.38831266973592, 6.37097544620762, 3.52638362703015]) -#} +RefData = [('twobitCModel6', 'twobitCModel', 64, 9.65280765420711), ('twobitCModel8', 'twobitCModel', 256, 8.75120245829945), ('twobitCModel10', 'twobitCModel', 1024, 8.1318382397263), + ('twobitCModel12', 'twobitCModel', 4096, 7.53026646633342), ('twobitCModel14', 'twobitCModel', 16384, 6.07679338544009), ('twobitCModel16', 'twobitCModel', 65536, 6.07679338544009), + ('gshareCModel6', 'gshareCModel', 64, 10.6602835418646), ('gshareCModel8', 'gshareCModel', 256, 8.38384710559667), ('gshareCModel10', 'gshareCModel', 1024, 6.36847432155534), + ('gshareCModel12', 'gshareCModel', 4096, 3.91108491151983), ('gshareCModel14', 'gshareCModel', 16384, 2.83926519215395), ('gshareCModel16', 'gshareCModel', 65536, .60213659066941)] -#RefData = [('twobitCModel6', 11.0501534891674), ('twobitCModel8', 8.51829052266352), ('twobitCModel10', 7.56775222626483), -# ('twobitCModel12', 6.31366834586515), ('twobitCModel14', 5.72699936834177), ('twobitCModel16', 5.72699936834177), -# ('gshareCModel6', 14.5731555979574), ('gshareCModel8', 12.3155658100497), ('gshareCModel10', 10.4589596630561), -# ('gshareCModel12', 8.25796055444401), ('gshareCModel14', 6.23093702707613), ('gshareCModel16', 3.34001125650374)] - -RefData = [('twobitCModel6', 9.65280765420711), ('twobitCModel8', 8.75120245829945), ('twobitCModel10', 8.1318382397263), - ('twobitCModel12', 7.53026646633342), ('twobitCModel14', 6.07679338544009), ('twobitCModel16', 6.07679338544009), - ('gshareCModel6', 10.6602835418646), ('gshareCModel8', 8.38384710559667), ('gshareCModel10', 6.36847432155534), - ('gshareCModel12', 3.91108491151983), ('gshareCModel14', 2.83926519215395), ('gshareCModel16', .60213659066941)] - - -def ComputeCPI(benchmark): - 'Computes and inserts CPI into benchmark stats.' - (nameString, opt, dataDict) = benchmark - CPI = 1.0 * int(dataDict['Mcycle']) / int(dataDict['InstRet']) - dataDict['CPI'] = CPI - -def ComputeBranchDirMissRate(benchmark): - 'Computes and inserts branch direction miss prediction rate.' - (nameString, opt, dataDict) = benchmark - branchDirMissRate = 100.0 * int(dataDict['BP Dir Wrong']) / int(dataDict['Br Count']) - dataDict['BDMR'] = branchDirMissRate - -def ComputeBranchTargetMissRate(benchmark): - 'Computes and inserts branch target miss prediction rate.' - # *** this is wrong in the verilog test bench - (nameString, opt, dataDict) = benchmark - branchTargetMissRate = 100.0 * int(dataDict['BP Target Wrong']) / (int(dataDict['Br Count']) + int(dataDict['Jump Not Return'])) - dataDict['BTMR'] = branchTargetMissRate - -def ComputeRASMissRate(benchmark): - 'Computes and inserts return address stack miss prediction rate.' - (nameString, opt, dataDict) = benchmark - RASMPR = 100.0 * int(dataDict['RAS Wrong']) / int(dataDict['Return']) - dataDict['RASMPR'] = RASMPR - -def ComputeInstrClassMissRate(benchmark): - 'Computes and inserts instruction class miss prediction rate.' - (nameString, opt, dataDict) = benchmark - ClassMPR = 100.0 * int(dataDict['Instr Class Wrong']) / int(dataDict['InstRet']) - dataDict['ClassMPR'] = ClassMPR +def ParseBranchListFile(path): + '''Take the path to the list of Questa Sim log files containing the performance counters outputs. File + is formated in row columns. Each row is a trace with the file, branch predictor type, and the parameters. + parameters can be any number and depend on the predictor type. Returns a list of lists.''' + lst = [] + BranchList = open(path, 'r') + for line in BranchList: + tokens = line.split() + predictorLog = os.path.dirname(path) + '/' + tokens[0] + predictorType = tokens[1] + predictorParams = tokens[2::] + lst.append([predictorLog, predictorType, predictorParams]) + #print(predictorLog, predictorType, predictorParams) + return lst -def ComputeICacheMissRate(benchmark): - 'Computes and inserts instruction class miss prediction rate.' - (nameString, opt, dataDict) = benchmark - ICacheMR = 100.0 * int(dataDict['I Cache Miss']) / int(dataDict['I Cache Access']) - dataDict['ICacheMR'] = ICacheMR - -def ComputeICacheMissTime(benchmark): - 'Computes and inserts instruction class miss prediction rate.' - (nameString, opt, dataDict) = benchmark - cycles = int(dataDict['I Cache Miss']) - if(cycles == 0): ICacheMR = 0 - else: ICacheMR = 100.0 * int(dataDict['I Cache Cycles']) / cycles - dataDict['ICacheMT'] = ICacheMR - -def ComputeDCacheMissRate(benchmark): - 'Computes and inserts instruction class miss prediction rate.' - (nameString, opt, dataDict) = benchmark - DCacheMR = 100.0 * int(dataDict['D Cache Miss']) / int(dataDict['D Cache Access']) - dataDict['DCacheMR'] = DCacheMR - -def ComputeDCacheMissTime(benchmark): - 'Computes and inserts instruction class miss prediction rate.' - (nameString, opt, dataDict) = benchmark - cycles = int(dataDict['D Cache Miss']) - if(cycles == 0): DCacheMR = 0 - else: DCacheMR = 100.0 * int(dataDict['D Cache Cycles']) / cycles - dataDict['DCacheMT'] = DCacheMR - -def ComputeAll(benchmarks): - for benchmark in benchmarks: - ComputeCPI(benchmark) - ComputeBranchDirMissRate(benchmark) - ComputeBranchTargetMissRate(benchmark) - ComputeRASMissRate(benchmark) - ComputeInstrClassMissRate(benchmark) - ComputeICacheMissRate(benchmark) - ComputeICacheMissTime(benchmark) - ComputeDCacheMissRate(benchmark) - ComputeDCacheMissTime(benchmark) - -def printStats(benchmark): - (nameString, opt, dataDict) = benchmark - print('Test', nameString) - print('Compile configuration', opt) - print('CPI \t\t\t %1.2f' % dataDict['CPI']) - print('Branch Dir Pred Miss Rate %2.2f' % dataDict['BDMR']) - print('Branch Target Pred Miss Rate %2.2f' % dataDict['BTMR']) - print('RAS Miss Rate \t\t %1.2f' % dataDict['RASMPR']) - print('Instr Class Miss Rate %1.2f' % dataDict['ClassMPR']) - print('I Cache Miss Rate %1.4f' % dataDict['ICacheMR']) - print('I Cache Miss Ave Cycles %1.4f' % dataDict['ICacheMT']) - print('D Cache Miss Rate %1.4f' % dataDict['DCacheMR']) - print('D Cache Miss Ave Cycles %1.4f' % dataDict['DCacheMT']) - print() - def ProcessFile(fileName): '''Extract preformance counters from a modelsim log. Outputs a list of tuples for each test/benchmark. The tuple contains the test name, optimization characteristics, and dictionary of performance counters.''' @@ -150,43 +69,37 @@ def ProcessFile(fileName): HPMClist = { } elif(len(lineToken) > 4 and lineToken[1][0:3] == 'Cnt'): countToken = line.split('=')[1].split() - value = int(countToken[0]) + value = int(countToken[0]) if countToken[0] != 'x' else 0 name = ' '.join(countToken[1:]) HPMClist[name] = value elif ('is done' in line): benchmarks.append((testName, opt, HPMClist)) return benchmarks -def ComputeArithmeticAverage(benchmarks): - average = {} - index = 0 - for (testName, opt, HPMClist) in benchmarks: - for field in HPMClist: - value = HPMClist[field] - if field not in average: - average[field] = value - else: - average[field] += value - index += 1 - benchmarks.append(('All', '', average)) -def FormatToPlot(currBenchmark): - names = [] - values = [] - for config in currBenchmark: - #print ('config' , config) - names.append(config[0]) - values.append(config[1]) - return (names, values) +def ComputeStats(benchmarks): + for benchmark in benchmarks: + (nameString, opt, dataDict) = benchmark + dataDict['CPI'] = 1.0 * int(dataDict['Mcycle']) / int(dataDict['InstRet']) + dataDict['BDMR'] = 100.0 * int(dataDict['BP Dir Wrong']) / int(dataDict['Br Count']) + dataDict['BTMR'] = 100.0 * int(dataDict['BP Target Wrong']) / (int(dataDict['Br Count']) + int(dataDict['Jump Not Return'])) + dataDict['RASMPR'] = 100.0 * int(dataDict['RAS Wrong']) / int(dataDict['Return']) + dataDict['ClassMPR'] = 100.0 * int(dataDict['Instr Class Wrong']) / int(dataDict['InstRet']) + dataDict['ICacheMR'] = 100.0 * int(dataDict['I Cache Miss']) / int(dataDict['I Cache Access']) + + cycles = int(dataDict['I Cache Miss']) + if(cycles == 0): ICacheMR = 0 + else: ICacheMR = 100.0 * int(dataDict['I Cache Cycles']) / cycles + dataDict['ICacheMT'] = ICacheMR + + dataDict['DCacheMR'] = 100.0 * int(dataDict['D Cache Miss']) / int(dataDict['D Cache Access']) + + (nameString, opt, dataDict) = benchmark + cycles = int(dataDict['D Cache Miss']) + if(cycles == 0): DCacheMR = 0 + else: DCacheMR = 100.0 * int(dataDict['D Cache Cycles']) / cycles + dataDict['DCacheMT'] = DCacheMR -def GeometricAverage(benchmarks, field): - Product = 1 - index = 0 - for (testName, opt, HPMCList) in benchmarks: - #print(HPMCList) - Product *= HPMCList[field] - index += 1 - return Product ** (1.0/index) def ComputeGeometricAverage(benchmarks): fields = ['BDMR', 'BTMR', 'RASMPR', 'ClassMPR', 'ICacheMR', 'DCacheMR', 'CPI', 'ICacheMT', 'DCacheMT'] @@ -196,129 +109,362 @@ def ComputeGeometricAverage(benchmarks): index = 0 for (testName, opt, HPMCList) in benchmarks: #print(HPMCList) - Product *= HPMCList[field] + value = HPMCList[field] + if(value != 0): Product *= value # if that value is 0 exclude from mean because it destories the geo mean index += 1 AllAve[field] = Product ** (1.0/index) - benchmarks.append(('All', '', AllAve)) + benchmarks.append(('Mean', '', AllAve)) -if(sys.argv[1] == '-b'): - configList = [] - summery = 0 - if(sys.argv[2] == '-s'): - summery = 1 - sys.argv = sys.argv[1::] - for config in sys.argv[2::]: - benchmarks = ProcessFile(config) - #ComputeArithmeticAverage(benchmarks) - ComputeAll(benchmarks) - ComputeGeometricAverage(benchmarks) - #print('CONFIG: %s GEO MEAN: %f' % (config, GeometricAverage(benchmarks, 'BDMR'))) - configList.append((config.split('.')[0], benchmarks)) +def GenerateName(predictorType, predictorParams): + if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class' or predictorType == 'ras'): + return predictorType + predictorParams[0] + elif(predictorParams == 'local'): + return predictorType + predictorParams[0] + '_' + predictorParams[1] + else: + print(f'Error unsupported predictor type {predictorType}') + sys.exit(-1) - # Merge all configruations into a single list - benchmarkAll = [] - for (config, benchmarks) in configList: - #print(config) +def ComputePredNumEntries(predictorType, predictorParams): + if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class'): + return 2**int(predictorParams[0]) + elif(predictorType == 'ras'): + return int(predictorParams[0]) + elif(predictorParams == 'local'): + return 2**int(predictorParams[0]) * int(predictorParams[1]) + 2**int(predictorParams[1]) + else: + print(f'Error unsupported predictor type {predictorType}') + sys.exit(-1) + +def BuildDataBase(predictorLogs): + # Once done with the following loop, performanceCounterList will contain the predictor type and size along with the + # raw performance counter data and the processed data on a per benchmark basis. It also includes the geometric mean. + # list + # branch predictor configuration 0 (tuple) + # benchmark name + # compiler optimization + # data (dictionary) + # dictionary of performance counters + # branch predictor configuration 1 (tuple) + # benchmark name (dictionary) + # compiler optimization + # data + # dictionary of performance counters + # ... + performanceCounterList = [] + for trace in predictorLogs: + predictorLog = trace[0] + predictorType = trace[1] + predictorParams = trace[2] + # Extract the performance counter data + performanceCounters = ProcessFile(predictorLog) + ComputeStats(performanceCounters) + ComputeGeometricAverage(performanceCounters) + #print(performanceCounters) + performanceCounterList.append([GenerateName(predictorType, predictorParams), predictorType, performanceCounters, ComputePredNumEntries(predictorType, predictorParams)]) + return performanceCounterList + +def ReorderDataBase(performanceCounterList): + # Reorder the data so the benchmark name comes first, then the branch predictor configuration + benchmarkFirstList = [] + for (predictorName, predictorPrefixName, benchmarks, entries) in performanceCounterList: for benchmark in benchmarks: (nameString, opt, dataDict) = benchmark - #print("BENCHMARK") - #print(nameString) - #print(opt) - #print(dataDict) - benchmarkAll.append((nameString, opt, config, dataDict)) - #print('ALL!!!!!!!!!!') - #for bench in benchmarkAll: - # print('BENCHMARK') - # print(bench) - #print('ALL!!!!!!!!!!') + benchmarkFirstList.append((nameString, opt, predictorName, predictorPrefixName, entries, dataDict)) + return benchmarkFirstList +def ExtractSelectedData(benchmarkFirstList): # now extract all branch prediction direction miss rates for each # namestring + opt, config benchmarkDict = { } - for benchmark in benchmarkAll: - (name, opt, config, dataDict) = benchmark - if name+'_'+opt in benchmarkDict: - benchmarkDict[name+'_'+opt].append((config, dataDict['BDMR'])) + for benchmark in benchmarkFirstList: + (name, opt, config, prefixName, entries, dataDict) = benchmark + if opt == 'bd_speedopt_speed': NewName = name+'Sp' + elif opt == 'bd_sizeopt_speed': NewName = name+'Sz' + else: NewName = name + #print(NewName) + #NewName = name+'_'+opt + if NewName in benchmarkDict: + benchmarkDict[NewName].append((config, prefixName, entries, dataDict[ReportPredictorType])) else: - benchmarkDict[name+'_'+opt] = [(config, dataDict['BDMR'])] + benchmarkDict[NewName] = [(config, prefixName, entries, dataDict[ReportPredictorType])] + return benchmarkDict - size = len(benchmarkDict) - index = 1 - if(summery == 0): - #print('Number of plots', size) +def ReportAsTable(benchmarkDict): + refLine = benchmarkDict['Mean'] + FirstLine = [] + SecondLine = [] + for (name, typ, size, val) in refLine: + FirstLine.append(name) + SecondLine.append(size) - for benchmarkName in benchmarkDict: - currBenchmark = benchmarkDict[benchmarkName] - (names, values) = FormatToPlot(currBenchmark) - print(names, values) - plt.subplot(6, 7, index) - plt.bar(names, values) - plt.title(benchmarkName) - plt.ylabel('BR Dir Miss Rate (%)') - #plt.xlabel('Predictor') - index += 1 - else: - combined = benchmarkDict['All_'] - # merge the reference data into rtl data - # combined.extend(RefData) - (name, value) = FormatToPlot(combined) - lst = [] - dct = {} - category = [] - length = [] - accuracy = [] - for index in range(0, len(name)): - match = re.match(r"([a-z]+)([0-9]+)", name[index], re.I) - percent = 100 -value[index] - if match: - (PredType, size) = match.groups() - category.append(PredType) - length.append(size) - accuracy.append(percent) - if(PredType not in dct): - dct[PredType] = ([size], [percent]) - else: - (currSize, currPercent) = dct[PredType] - currSize.append(size) - currPercent.append(percent) - dct[PredType] = (currSize, currPercent) - print(dct) + sys.stdout.write('benchmark\t\t') + for name in FirstLine: + if(len(name) < 8): sys.stdout.write('%s\t\t' % name) + else: sys.stdout.write('%s\t' % name) + sys.stdout.write('\n') + sys.stdout.write('size\t\t\t') + for size in SecondLine: + if(len(str(size)) < 8): sys.stdout.write('%d\t\t' % size) + else: sys.stdout.write('%d\t' % size) + sys.stdout.write('\n') + + if(args.summary): + sys.stdout.write('Mean\t\t\t') + for (name, typ, size, val) in refLine: + sys.stdout.write('%0.2f\t\t' % (val if not args.invert else 100 - val)) + sys.stdout.write('\n') + + if(not args.summary): + for benchmark in benchmarkDict: + length = len(benchmark) + if(length < 8): sys.stdout.write('%s\t\t\t' % benchmark) + elif(length < 16): sys.stdout.write('%s\t\t' % benchmark) + else: sys.stdout.write('%s\t' % benchmark) + for (name, typ, size, val) in benchmarkDict[benchmark]: + sys.stdout.write('%0.2f\t\t' % (val if not args.invert else 100 -val)) + sys.stdout.write('\n') + +def ReportAsText(benchmarkDict): + if(args.summary): + mean = benchmarkDict['Mean'] + print('Mean') + for (name, typ, size, val) in mean: + sys.stdout.write('%s %s %0.2f\n' % (name, size, val if not args.invert else 100 - val)) + + if(not args.summary): + for benchmark in benchmarkDict: + print(benchmark) + for (name, type, size, val) in benchmarkDict[benchmark]: + sys.stdout.write('%s %s %0.2f\n' % (name, size, val if not args.invert else 100 - val)) + +def Inversion(lst): + return [x if not args.invert else 100 - x for x in lst] + +def BarGraph(seriesDict, xlabelList, BenchPerRow, FileName): + index = 0 + NumberInGroup = len(seriesDict) + # Figure out width of bars. NumberInGroup bars + want 2 bar space + # the space between groups is 1 + EffectiveNumInGroup = NumberInGroup + 2 + barWidth = 1 / EffectiveNumInGroup + fig = plt.subplots(figsize = (EffectiveNumInGroup*BenchPerRow/8, 4)) + colors = ['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'black', 'black', 'black', 'black', 'black', 'black'] + for name in seriesDict: + xpos = np.arange(BenchPerRow) + xpos = [x + index*barWidth for x in xpos] + values = seriesDict[name] + plt.bar(xpos, Inversion(values), width=barWidth, edgecolor='grey', label=name, color=colors[index%len(colors)]) + index += 1 + plt.xticks([r + barWidth*(NumberInGroup/2-0.5) for r in range(0, BenchPerRow)], xlabelList) + plt.xlabel('Benchmark') + if(not args.invert): plt.ylabel('Misprediction Rate (%)') + else: plt.ylabel('Prediction Accuracy (%)') + plt.legend(loc='upper left', ncol=2) + plt.savefig(FileName) + +def SelectPartition(xlabelListBig, seriesDictBig, group, BenchPerRow): + seriesDictTrunk = {} + for benchmarkName in seriesDictBig: + lst = seriesDictBig[benchmarkName] + seriesDictTrunk[benchmarkName] = lst[group*BenchPerRow:(group+1)*BenchPerRow] + xlabelListTrunk = xlabelListBig[group*BenchPerRow:(group+1)*BenchPerRow] + return(xlabelListTrunk, seriesDictTrunk) + + +def ReportAsGraph(benchmarkDict, bar): + def FormatToPlot(currBenchmark): + names = [] + sizes = [] + values = [] + typs = [] + for config in currBenchmark: + names.append(config[0]) + sizes.append(config[1]) + values.append(config[2]) + typs.append(config[3]) + return (names, sizes, values, typs) + titlesInvert = {'BDMR' : 'Branch Direction Accuracy', + 'BTMR' : 'Branch Target Accuracy', + 'RASMPR': 'RAS Accuracy', + 'ClassMPR': 'Class Prediction Accuracy'} + titles = {'BDMR' : 'Branch Direction Misprediction', + 'BTMR' : 'Branch Target Misprediction', + 'RASMPR': 'RAS Misprediction', + 'ClassMPR': 'Class Misprediction'} + if(args.summary): + markers = ['x', '.', '+', '*', '^', 'o', ',', 's'] + colors = ['blue', 'black', 'gray', 'dodgerblue', 'lightsteelblue', 'turquoise', 'black', 'blue'] + temp = benchmarkDict['Mean'] + + # the benchmarkDict['Mean'] contains sequencies of results for multiple + # branch predictors with various parameterizations + # group the parameterizations by the common typ. + sequencies = {} + for (name, typ, size, value) in benchmarkDict['Mean']: + if not typ in sequencies: + sequencies[typ] = [(size, value)] + else: + sequencies[typ].append((size,value)) + # then graph the common typ as a single line+scatter plot + # finally repeat for all typs of branch predictors and overlay fig, axes = plt.subplots() - marker={'twobit' : '^', 'gshare' : 'o', 'global' : 's', 'gshareBasic' : '*', 'globalBasic' : 'x', 'btb': 'x', 'twobitCModel' : 'x', 'gshareCModel' : '*', 'tenlocal' : '.', 'eightlocal' : ',', 'fourlocal' : 'x', 'tenlocalahead' : '.', 'eightlocalahead' : ',', 'fourlocalahead' : 'x', 'tenlocalrepair' : 'x'} - colors={'twobit' : 'black', 'gshare' : 'blue', 'global' : 'dodgerblue', 'gshareBasic' : 'turquoise', 'globalBasic' : 'lightsteelblue', 'btb' : 'blue', 'twobitCModel' : 'gray', 'gshareCModel' : 'dodgerblue', 'tenlocal' : 'lightblue', 'eightlocal' : 'lightblue', 'fourlocal' : 'lightblue', 'tenlocalahead' : 'lightblue', 'eightlocalahead' : 'lightblue', 'fourlocalahead' : 'lightblue', 'tenlocalrepair' : 'lightblue'} - for cat in dct: - (x, y) = dct[cat] - x=[int(2**int(v)) for v in x] - #print(x, y) - print(cat) - axes.plot(x,y, color=colors[cat]) - axes.scatter(x,y, label=cat, marker=marker[cat], color=colors[cat]) - #plt.scatter(x, y, label=cat) - #plt.plot(x, y) - #axes.set_xticks([4, 6, 8, 10, 12, 14]) + index = 0 + if(args.invert): plt.title(titlesInvert[ReportPredictorType]) + else: plt.title(titles[ReportPredictorType]) + for branchPredName in sequencies: + data = sequencies[branchPredName] + (xdata, ydata) = zip(*data) + if args.invert: ydata = [100 - x for x in ydata] + axes.plot(xdata, ydata, color=colors[index]) + axes.scatter(xdata, ydata, label=branchPredName, color=colors[index], marker=markers[index]) + index = (index + 1) % len(markers) axes.legend(loc='upper left') axes.set_xscale("log") axes.set_ylabel('Prediction Accuracy') axes.set_xlabel('Entries') - axes.set_xticks([64, 256, 1024, 4096, 16384, 65536]) - axes.set_xticklabels([64, 256, 1024, 4096, 16384, 65536]) + axes.set_xticks(xdata) + axes.set_xticklabels(xdata) axes.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) - plt.show() - - -else: - # steps 1 and 2 - benchmarks = ProcessFile(sys.argv[1]) - print(benchmarks[0]) - ComputeAll(benchmarks) - ComputeGeometricAverage(benchmarks) - # 3 process into useful data - # cache hit rates - # cache fill time - # branch predictor status - # hazard counts - # CPI - # instruction distribution - for benchmark in benchmarks: - printStats(benchmark) + plt.show() + + # if(not args.summary): + # size = len(benchmarkDict) + # sizeSqrt = math.sqrt(size) + # isSquare = math.isclose(sizeSqrt, round(sizeSqrt)) + # numCol = math.floor(sizeSqrt) + # numRow = numCol + (0 if isSquare else 1) + # index = 1 + # fig = plt.figure() + # for benchmarkName in benchmarkDict: + # currBenchmark = benchmarkDict[benchmarkName] + # (names, typs, sizes, values) = FormatToPlot(currBenchmark) + # #axes.plot(numRow, numCol, index) + # ax = fig.add_subplot(numRow, numCol, index) + # ax.bar(names, values) + # ax.title.set_text(benchmarkName) + # #plt.ylabel('BR Dir Miss Rate (%)') + # #plt.xlabel('Predictor') + # index += 1 + + if(not args.summary): + size = len(benchmarkDict) + sizeSqrt = math.sqrt(size) + isSquare = math.isclose(sizeSqrt, round(sizeSqrt)) + numCol = math.floor(sizeSqrt) + numRow = numCol + (0 if isSquare else 1) + index = 1 + BenchPerRow = 7 + + xlabelList = [] + seriesDict = {} + + for benchmarkName in benchmarkDict: + currBenchmark = benchmarkDict[benchmarkName] + xlabelList.append(benchmarkName) + for (name, typ, size, value) in currBenchmark: + if(name not in seriesDict): + seriesDict[name] = [value] + else: + seriesDict[name].append(value) + if(index >= BenchPerRow): break + index += 1 + + xlabelListBig = [] + seriesDictBig = {} + for benchmarkName in benchmarkDict: + currBenchmark = benchmarkDict[benchmarkName] + xlabelListBig.append(benchmarkName) + for (name, typ, size, value) in currBenchmark: + if(name not in seriesDictBig): + seriesDictBig[name] = [value] + else: + seriesDictBig[name].append(value) + + #The next step will be to split the benchmarkDict into length BenchPerRow pieces then repeat the following code + # on each piece. + for row in range(0, math.ceil(39 / BenchPerRow)): + (xlabelListTrunk, seriesDictTrunk) = SelectPartition(xlabelListBig, seriesDictBig, row, BenchPerRow) + FileName = 'barSegment%d.png' % row + groupLen = len(xlabelListTrunk) + BarGraph(seriesDictTrunk, xlabelListTrunk, groupLen, FileName) + + +# main +parser = argparse.ArgumentParser(description='Parses performance counters from a Questa Sim trace to produce a graph or graphs.') + +# parse program arguments +metric = parser.add_mutually_exclusive_group() +metric.add_argument('-r', '--ras', action='store_const', help='Plot return address stack (RAS) performance.', default=False, const=True) +metric.add_argument('-d', '--direction', action='store_const', help='Plot direction prediction (2-bit, Gshare, local, etc) performance.', default=False, const=True) +metric.add_argument('-t', '--target', action='store_const', help='Plot branch target buffer (BTB) performance.', default=False, const=True) +metric.add_argument('-c', '--iclass', action='store_const', help='Plot instruction classification performance.', default=False, const=True) + +parser.add_argument('-s', '--summary', action='store_const', help='Show only the geometric average for all benchmarks.', default=False, const=True) +parser.add_argument('-b', '--bar', action='store_const', help='Plot graphs.', default=False, const=True) +parser.add_argument('-g', '--reference', action='store_const', help='Include the golden reference model from branch-predictor-simulator. Data stored statically at the top of %(prog)s. If you need to regenreate use CModelBranchAcurracy.sh', default=False, const=True) +parser.add_argument('-i', '--invert', action='store_const', help='Invert metric. Example Branch miss prediction becomes prediction accuracy. 100 - miss rate', default=False, const=True) + +displayMode = parser.add_mutually_exclusive_group() +displayMode.add_argument('--text', action='store_const', help='Display in text format only.', default=False, const=True) +displayMode.add_argument('--table', action='store_const', help='Display in text format only.', default=False, const=True) +displayMode.add_argument('--gui', action='store_const', help='Display in text format only.', default=False, const=True) +displayMode.add_argument('--debug', action='store_const', help='Display in text format only.', default=False, const=True) +parser.add_argument('sources', nargs=1) + +args = parser.parse_args() + +# Figure what we are reporting +ReportPredictorType = 'BDMR' # default +if(args.ras): ReportPredictorType = 'RASMPR' +if(args.target): ReportPredictorType = 'BTMR' +if(args.iclass): ReportPredictorType = 'ClassMPR' + +# Figure how we are displaying the data +ReportMode = 'gui' # default +if(args.text): ReportMode = 'text' +if(args.table): ReportMode = 'table' +if(args.debug): ReportMode = 'debug' + +# read the questa sim list file. +# row, col format. each row is a questa sim run with performance counters and a particular +# branch predictor type and size. size can be multiple parameters for more complex predictors like +# local history and tage. +# +predictorLogs = ParseBranchListFile(args.sources[0]) # digests the traces +performanceCounterList = BuildDataBase(predictorLogs) # builds a database of performance counters by trace and then by benchmark +benchmarkFirstList = ReorderDataBase(performanceCounterList) # reorder first by benchmark then trace +benchmarkDict = ExtractSelectedData(benchmarkFirstList) # filters to just the desired performance counter metric + +if(args.reference): benchmarkDict['Mean'].extend(RefData) +#print(benchmarkDict['Mean']) +#print(benchmarkDict['aha-mont64Speed']) +#print(benchmarkDict) + +# table format +if(ReportMode == 'table'): + ReportAsTable(benchmarkDict) + +if(ReportMode == 'text'): + ReportAsText(benchmarkDict) + +if(ReportMode == 'gui'): + ReportAsGraph(benchmarkDict, args.bar) + +# *** this is only needed of -b (no -s) + +# debug +#config0 = performanceCounterList[0][0] +#data0 = performanceCounterList[0][1] +#bench0 = data0[0] +#bench0name = bench0[0] +#bench0data = bench0[2] +#bench0BrCount = bench0data['Br Count'] +#bench1 = data0[1] + +#print(data0) +#print(bench0) +#print(bench1) + +#print(bench0name) +#print(bench0BrCount) diff --git a/bin/parseTest.py b/bin/parseTest.py deleted file mode 100755 index bb6d2871e..000000000 --- a/bin/parseTest.py +++ /dev/null @@ -1,470 +0,0 @@ -#!/usr/bin/python3 - -########################################### -## Written: Rose Thompson ross1728@gmail.com -## Created: 20 September 2023 -## Modified: -## -## Purpose: Parses the performance counters from a modelsim trace. -## -## A component of the CORE-V-WALLY configurable RISC-V project. -## -## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University -## -## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 -## -## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file -## except in compliance with the License, or, at your option, the Apache License version 2.0. You -## may obtain a copy of the License at -## -## https:##solderpad.org/licenses/SHL-2.1/ -## -## Unless required by applicable law or agreed to in writing, any work 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. -################################################################################################ - -import os -import sys -import matplotlib.pyplot as plt -import math -import numpy as np -import argparse - -RefData = [('twobitCModel6', 'twobitCModel', 64, 9.65280765420711), ('twobitCModel8', 'twobitCModel', 256, 8.75120245829945), ('twobitCModel10', 'twobitCModel', 1024, 8.1318382397263), - ('twobitCModel12', 'twobitCModel', 4096, 7.53026646633342), ('twobitCModel14', 'twobitCModel', 16384, 6.07679338544009), ('twobitCModel16', 'twobitCModel', 65536, 6.07679338544009), - ('gshareCModel6', 'gshareCModel', 64, 10.6602835418646), ('gshareCModel8', 'gshareCModel', 256, 8.38384710559667), ('gshareCModel10', 'gshareCModel', 1024, 6.36847432155534), - ('gshareCModel12', 'gshareCModel', 4096, 3.91108491151983), ('gshareCModel14', 'gshareCModel', 16384, 2.83926519215395), ('gshareCModel16', 'gshareCModel', 65536, .60213659066941)] - -def ParseBranchListFile(path): - '''Take the path to the list of Questa Sim log files containing the performance counters outputs. File - is formated in row columns. Each row is a trace with the file, branch predictor type, and the parameters. - parameters can be any number and depend on the predictor type. Returns a list of lists.''' - lst = [] - BranchList = open(path, 'r') - for line in BranchList: - tokens = line.split() - predictorLog = os.path.dirname(path) + '/' + tokens[0] - predictorType = tokens[1] - predictorParams = tokens[2::] - lst.append([predictorLog, predictorType, predictorParams]) - #print(predictorLog, predictorType, predictorParams) - return lst - -def ProcessFile(fileName): - '''Extract preformance counters from a modelsim log. Outputs a list of tuples for each test/benchmark. - The tuple contains the test name, optimization characteristics, and dictionary of performance counters.''' - # 1 find lines with Read memfile and extract test name - # 2 parse counters into a list of (name, value) tuples (dictionary maybe?) - benchmarks = [] - transcript = open(fileName, 'r') - HPMClist = { } - testName = '' - for line in transcript.readlines(): - lineToken = line.split() - if(len(lineToken) > 3 and lineToken[1] == 'Read' and lineToken[2] == 'memfile'): - opt = lineToken[3].split('/')[-4] - testName = lineToken[3].split('/')[-1].split('.')[0] - HPMClist = { } - elif(len(lineToken) > 4 and lineToken[1][0:3] == 'Cnt'): - countToken = line.split('=')[1].split() - value = int(countToken[0]) if countToken[0] != 'x' else 0 - name = ' '.join(countToken[1:]) - HPMClist[name] = value - elif ('is done' in line): - benchmarks.append((testName, opt, HPMClist)) - return benchmarks - - -def ComputeStats(benchmarks): - for benchmark in benchmarks: - (nameString, opt, dataDict) = benchmark - dataDict['CPI'] = 1.0 * int(dataDict['Mcycle']) / int(dataDict['InstRet']) - dataDict['BDMR'] = 100.0 * int(dataDict['BP Dir Wrong']) / int(dataDict['Br Count']) - dataDict['BTMR'] = 100.0 * int(dataDict['BP Target Wrong']) / (int(dataDict['Br Count']) + int(dataDict['Jump Not Return'])) - dataDict['RASMPR'] = 100.0 * int(dataDict['RAS Wrong']) / int(dataDict['Return']) - dataDict['ClassMPR'] = 100.0 * int(dataDict['Instr Class Wrong']) / int(dataDict['InstRet']) - dataDict['ICacheMR'] = 100.0 * int(dataDict['I Cache Miss']) / int(dataDict['I Cache Access']) - - cycles = int(dataDict['I Cache Miss']) - if(cycles == 0): ICacheMR = 0 - else: ICacheMR = 100.0 * int(dataDict['I Cache Cycles']) / cycles - dataDict['ICacheMT'] = ICacheMR - - dataDict['DCacheMR'] = 100.0 * int(dataDict['D Cache Miss']) / int(dataDict['D Cache Access']) - - (nameString, opt, dataDict) = benchmark - cycles = int(dataDict['D Cache Miss']) - if(cycles == 0): DCacheMR = 0 - else: DCacheMR = 100.0 * int(dataDict['D Cache Cycles']) / cycles - dataDict['DCacheMT'] = DCacheMR - - -def ComputeGeometricAverage(benchmarks): - fields = ['BDMR', 'BTMR', 'RASMPR', 'ClassMPR', 'ICacheMR', 'DCacheMR', 'CPI', 'ICacheMT', 'DCacheMT'] - AllAve = {} - for field in fields: - Product = 1 - index = 0 - for (testName, opt, HPMCList) in benchmarks: - #print(HPMCList) - value = HPMCList[field] - if(value != 0): Product *= value # if that value is 0 exclude from mean because it destories the geo mean - index += 1 - AllAve[field] = Product ** (1.0/index) - benchmarks.append(('Mean', '', AllAve)) - -def GenerateName(predictorType, predictorParams): - if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class' or predictorType == 'ras'): - return predictorType + predictorParams[0] - elif(predictorParams == 'local'): - return predictorType + predictorParams[0] + '_' + predictorParams[1] - else: - print(f'Error unsupported predictor type {predictorType}') - sys.exit(-1) - -def ComputePredNumEntries(predictorType, predictorParams): - if(predictorType == 'gshare' or predictorType == 'twobit' or predictorType == 'btb' or predictorType == 'class'): - return 2**int(predictorParams[0]) - elif(predictorType == 'ras'): - return int(predictorParams[0]) - elif(predictorParams == 'local'): - return 2**int(predictorParams[0]) * int(predictorParams[1]) + 2**int(predictorParams[1]) - else: - print(f'Error unsupported predictor type {predictorType}') - sys.exit(-1) - -def BuildDataBase(predictorLogs): - # Once done with the following loop, performanceCounterList will contain the predictor type and size along with the - # raw performance counter data and the processed data on a per benchmark basis. It also includes the geometric mean. - # list - # branch predictor configuration 0 (tuple) - # benchmark name - # compiler optimization - # data (dictionary) - # dictionary of performance counters - # branch predictor configuration 1 (tuple) - # benchmark name (dictionary) - # compiler optimization - # data - # dictionary of performance counters - # ... - performanceCounterList = [] - for trace in predictorLogs: - predictorLog = trace[0] - predictorType = trace[1] - predictorParams = trace[2] - # Extract the performance counter data - performanceCounters = ProcessFile(predictorLog) - ComputeStats(performanceCounters) - ComputeGeometricAverage(performanceCounters) - #print(performanceCounters) - performanceCounterList.append([GenerateName(predictorType, predictorParams), predictorType, performanceCounters, ComputePredNumEntries(predictorType, predictorParams)]) - return performanceCounterList - -def ReorderDataBase(performanceCounterList): - # Reorder the data so the benchmark name comes first, then the branch predictor configuration - benchmarkFirstList = [] - for (predictorName, predictorPrefixName, benchmarks, entries) in performanceCounterList: - for benchmark in benchmarks: - (nameString, opt, dataDict) = benchmark - benchmarkFirstList.append((nameString, opt, predictorName, predictorPrefixName, entries, dataDict)) - return benchmarkFirstList - -def ExtractSelectedData(benchmarkFirstList): - # now extract all branch prediction direction miss rates for each - # namestring + opt, config - benchmarkDict = { } - for benchmark in benchmarkFirstList: - (name, opt, config, prefixName, entries, dataDict) = benchmark - if opt == 'bd_speedopt_speed': NewName = name+'Sp' - elif opt == 'bd_sizeopt_speed': NewName = name+'Sz' - else: NewName = name - #print(NewName) - #NewName = name+'_'+opt - if NewName in benchmarkDict: - benchmarkDict[NewName].append((config, prefixName, entries, dataDict[ReportPredictorType])) - else: - benchmarkDict[NewName] = [(config, prefixName, entries, dataDict[ReportPredictorType])] - return benchmarkDict - -def ReportAsTable(benchmarkDict): - refLine = benchmarkDict['Mean'] - FirstLine = [] - SecondLine = [] - for (name, typ, size, val) in refLine: - FirstLine.append(name) - SecondLine.append(size) - - sys.stdout.write('benchmark\t\t') - for name in FirstLine: - if(len(name) < 8): sys.stdout.write('%s\t\t' % name) - else: sys.stdout.write('%s\t' % name) - sys.stdout.write('\n') - sys.stdout.write('size\t\t\t') - for size in SecondLine: - if(len(str(size)) < 8): sys.stdout.write('%d\t\t' % size) - else: sys.stdout.write('%d\t' % size) - sys.stdout.write('\n') - - if(args.summary): - sys.stdout.write('Mean\t\t\t') - for (name, typ, size, val) in refLine: - sys.stdout.write('%0.2f\t\t' % (val if not args.invert else 100 - val)) - sys.stdout.write('\n') - - if(not args.summary): - for benchmark in benchmarkDict: - length = len(benchmark) - if(length < 8): sys.stdout.write('%s\t\t\t' % benchmark) - elif(length < 16): sys.stdout.write('%s\t\t' % benchmark) - else: sys.stdout.write('%s\t' % benchmark) - for (name, typ, size, val) in benchmarkDict[benchmark]: - sys.stdout.write('%0.2f\t\t' % (val if not args.invert else 100 -val)) - sys.stdout.write('\n') - -def ReportAsText(benchmarkDict): - if(args.summary): - mean = benchmarkDict['Mean'] - print('Mean') - for (name, typ, size, val) in mean: - sys.stdout.write('%s %s %0.2f\n' % (name, size, val if not args.invert else 100 - val)) - - if(not args.summary): - for benchmark in benchmarkDict: - print(benchmark) - for (name, type, size, val) in benchmarkDict[benchmark]: - sys.stdout.write('%s %s %0.2f\n' % (name, size, val if not args.invert else 100 - val)) - -def Inversion(lst): - return [x if not args.invert else 100 - x for x in lst] - -def BarGraph(seriesDict, xlabelList, BenchPerRow, FileName): - index = 0 - NumberInGroup = len(seriesDict) - # Figure out width of bars. NumberInGroup bars + want 2 bar space - # the space between groups is 1 - EffectiveNumInGroup = NumberInGroup + 2 - barWidth = 1 / EffectiveNumInGroup - fig = plt.subplots(figsize = (EffectiveNumInGroup*BenchPerRow/8, 4)) - colors = ['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'black', 'black', 'black', 'black', 'black', 'black'] - for name in seriesDict: - xpos = np.arange(BenchPerRow) - xpos = [x + index*barWidth for x in xpos] - values = seriesDict[name] - plt.bar(xpos, Inversion(values), width=barWidth, edgecolor='grey', label=name, color=colors[index%len(colors)]) - index += 1 - plt.xticks([r + barWidth*(NumberInGroup/2-0.5) for r in range(0, BenchPerRow)], xlabelList) - plt.xlabel('Benchmark') - if(not args.invert): plt.ylabel('Misprediction Rate (%)') - else: plt.ylabel('Prediction Accuracy (%)') - plt.legend(loc='upper left', ncol=2) - plt.savefig(FileName) - -def SelectPartition(xlabelListBig, seriesDictBig, group, BenchPerRow): - seriesDictTrunk = {} - for benchmarkName in seriesDictBig: - lst = seriesDictBig[benchmarkName] - seriesDictTrunk[benchmarkName] = lst[group*BenchPerRow:(group+1)*BenchPerRow] - xlabelListTrunk = xlabelListBig[group*BenchPerRow:(group+1)*BenchPerRow] - return(xlabelListTrunk, seriesDictTrunk) - - -def ReportAsGraph(benchmarkDict, bar): - def FormatToPlot(currBenchmark): - names = [] - sizes = [] - values = [] - typs = [] - for config in currBenchmark: - names.append(config[0]) - sizes.append(config[1]) - values.append(config[2]) - typs.append(config[3]) - return (names, sizes, values, typs) - titlesInvert = {'BDMR' : 'Branch Direction Accuracy', - 'BTMR' : 'Branch Target Accuracy', - 'RASMPR': 'RAS Accuracy', - 'ClassMPR': 'Class Prediction Accuracy'} - titles = {'BDMR' : 'Branch Direction Misprediction', - 'BTMR' : 'Branch Target Misprediction', - 'RASMPR': 'RAS Misprediction', - 'ClassMPR': 'Class Misprediction'} - if(args.summary): - markers = ['x', '.', '+', '*', '^', 'o', ',', 's'] - colors = ['blue', 'black', 'gray', 'dodgerblue', 'lightsteelblue', 'turquoise', 'black', 'blue'] - temp = benchmarkDict['Mean'] - - # the benchmarkDict['Mean'] contains sequencies of results for multiple - # branch predictors with various parameterizations - # group the parameterizations by the common typ. - sequencies = {} - for (name, typ, size, value) in benchmarkDict['Mean']: - if not typ in sequencies: - sequencies[typ] = [(size, value)] - else: - sequencies[typ].append((size,value)) - # then graph the common typ as a single line+scatter plot - # finally repeat for all typs of branch predictors and overlay - fig, axes = plt.subplots() - index = 0 - if(args.invert): plt.title(titlesInvert[ReportPredictorType]) - else: plt.title(titles[ReportPredictorType]) - for branchPredName in sequencies: - data = sequencies[branchPredName] - (xdata, ydata) = zip(*data) - if args.invert: ydata = [100 - x for x in ydata] - axes.plot(xdata, ydata, color=colors[index]) - axes.scatter(xdata, ydata, label=branchPredName, color=colors[index], marker=markers[index]) - index = (index + 1) % len(markers) - axes.legend(loc='upper left') - axes.set_xscale("log") - axes.set_ylabel('Prediction Accuracy') - axes.set_xlabel('Entries') - axes.set_xticks(xdata) - axes.set_xticklabels(xdata) - axes.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) - plt.show() - - - # if(not args.summary): - # size = len(benchmarkDict) - # sizeSqrt = math.sqrt(size) - # isSquare = math.isclose(sizeSqrt, round(sizeSqrt)) - # numCol = math.floor(sizeSqrt) - # numRow = numCol + (0 if isSquare else 1) - # index = 1 - # fig = plt.figure() - # for benchmarkName in benchmarkDict: - # currBenchmark = benchmarkDict[benchmarkName] - # (names, typs, sizes, values) = FormatToPlot(currBenchmark) - # #axes.plot(numRow, numCol, index) - # ax = fig.add_subplot(numRow, numCol, index) - # ax.bar(names, values) - # ax.title.set_text(benchmarkName) - # #plt.ylabel('BR Dir Miss Rate (%)') - # #plt.xlabel('Predictor') - # index += 1 - - if(not args.summary): - size = len(benchmarkDict) - sizeSqrt = math.sqrt(size) - isSquare = math.isclose(sizeSqrt, round(sizeSqrt)) - numCol = math.floor(sizeSqrt) - numRow = numCol + (0 if isSquare else 1) - index = 1 - BenchPerRow = 7 - - xlabelList = [] - seriesDict = {} - - for benchmarkName in benchmarkDict: - currBenchmark = benchmarkDict[benchmarkName] - xlabelList.append(benchmarkName) - for (name, typ, size, value) in currBenchmark: - if(name not in seriesDict): - seriesDict[name] = [value] - else: - seriesDict[name].append(value) - if(index >= BenchPerRow): break - index += 1 - - xlabelListBig = [] - seriesDictBig = {} - for benchmarkName in benchmarkDict: - currBenchmark = benchmarkDict[benchmarkName] - xlabelListBig.append(benchmarkName) - for (name, typ, size, value) in currBenchmark: - if(name not in seriesDictBig): - seriesDictBig[name] = [value] - else: - seriesDictBig[name].append(value) - - #The next step will be to split the benchmarkDict into length BenchPerRow pieces then repeat the following code - # on each piece. - for row in range(0, math.ceil(39 / BenchPerRow)): - (xlabelListTrunk, seriesDictTrunk) = SelectPartition(xlabelListBig, seriesDictBig, row, BenchPerRow) - FileName = 'barSegment%d.png' % row - groupLen = len(xlabelListTrunk) - BarGraph(seriesDictTrunk, xlabelListTrunk, groupLen, FileName) - - -# main -parser = argparse.ArgumentParser(description='Parses performance counters from a Questa Sim trace to produce a graph or graphs.') - -# parse program arguments -metric = parser.add_mutually_exclusive_group() -metric.add_argument('-r', '--ras', action='store_const', help='Plot return address stack (RAS) performance.', default=False, const=True) -metric.add_argument('-d', '--direction', action='store_const', help='Plot direction prediction (2-bit, Gshare, local, etc) performance.', default=False, const=True) -metric.add_argument('-t', '--target', action='store_const', help='Plot branch target buffer (BTB) performance.', default=False, const=True) -metric.add_argument('-c', '--iclass', action='store_const', help='Plot instruction classification performance.', default=False, const=True) - -parser.add_argument('-s', '--summary', action='store_const', help='Show only the geometric average for all benchmarks.', default=False, const=True) -parser.add_argument('-b', '--bar', action='store_const', help='Plot graphs.', default=False, const=True) -parser.add_argument('-g', '--reference', action='store_const', help='Include the golden reference model from branch-predictor-simulator. Data stored statically at the top of %(prog)s. If you need to regenreate use CModelBranchAcurracy.sh', default=False, const=True) -parser.add_argument('-i', '--invert', action='store_const', help='Invert metric. Example Branch miss prediction becomes prediction accuracy. 100 - miss rate', default=False, const=True) - -displayMode = parser.add_mutually_exclusive_group() -displayMode.add_argument('--text', action='store_const', help='Display in text format only.', default=False, const=True) -displayMode.add_argument('--table', action='store_const', help='Display in text format only.', default=False, const=True) -displayMode.add_argument('--gui', action='store_const', help='Display in text format only.', default=False, const=True) -displayMode.add_argument('--debug', action='store_const', help='Display in text format only.', default=False, const=True) -parser.add_argument('sources', nargs=1) - -args = parser.parse_args() - -# Figure what we are reporting -ReportPredictorType = 'BDMR' # default -if(args.ras): ReportPredictorType = 'RASMPR' -if(args.target): ReportPredictorType = 'BTMR' -if(args.iclass): ReportPredictorType = 'ClassMPR' - -# Figure how we are displaying the data -ReportMode = 'gui' # default -if(args.text): ReportMode = 'text' -if(args.table): ReportMode = 'table' -if(args.debug): ReportMode = 'debug' - -# read the questa sim list file. -# row, col format. each row is a questa sim run with performance counters and a particular -# branch predictor type and size. size can be multiple parameters for more complex predictors like -# local history and tage. -# -predictorLogs = ParseBranchListFile(args.sources[0]) # digests the traces -performanceCounterList = BuildDataBase(predictorLogs) # builds a database of performance counters by trace and then by benchmark -benchmarkFirstList = ReorderDataBase(performanceCounterList) # reorder first by benchmark then trace -benchmarkDict = ExtractSelectedData(benchmarkFirstList) # filters to just the desired performance counter metric - -if(args.reference): benchmarkDict['Mean'].extend(RefData) -#print(benchmarkDict['Mean']) -#print(benchmarkDict['aha-mont64Speed']) -#print(benchmarkDict) - -# table format -if(ReportMode == 'table'): - ReportAsTable(benchmarkDict) - -if(ReportMode == 'text'): - ReportAsText(benchmarkDict) - -if(ReportMode == 'gui'): - ReportAsGraph(benchmarkDict, args.bar) - -# *** this is only needed of -b (no -s) - -# debug -#config0 = performanceCounterList[0][0] -#data0 = performanceCounterList[0][1] -#bench0 = data0[0] -#bench0name = bench0[0] -#bench0data = bench0[2] -#bench0BrCount = bench0data['Br Count'] -#bench1 = data0[1] - -#print(data0) -#print(bench0) -#print(bench1) - -#print(bench0name) -#print(bench0BrCount) From 5085fef3caea0d5fad0b327f19c1f7bc862e9f4f Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Tue, 3 Oct 2023 17:37:13 -0500 Subject: [PATCH 10/10] Somehow the arty A7 was missing the update for the console baud rate setting. --- linux/devicetree/wally-artya7.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/devicetree/wally-artya7.dts b/linux/devicetree/wally-artya7.dts index 57b9599e5..4206c7804 100644 --- a/linux/devicetree/wally-artya7.dts +++ b/linux/devicetree/wally-artya7.dts @@ -9,7 +9,7 @@ chosen { linux,initrd-end = <0x85c43a00>; linux,initrd-start = <0x84200000>; - bootargs = "root=/dev/vda ro"; + bootargs = "root=/dev/vda ro console=ttyS0,115200"; stdout-path = "/soc/uart@10000000"; };