xref: /freebsd/usr.sbin/pmc/display.hh (revision a53d2e4f5db588cfd59cdebf04536b6ca7a70e4b)
1*a53d2e4fSAli Mashtizadeh /*-
2*a53d2e4fSAli Mashtizadeh  * SPDX-License-Identifier: BSD-2-Clause
3*a53d2e4fSAli Mashtizadeh  *
4*a53d2e4fSAli Mashtizadeh  * Copyright (c) 2026, Netflix, Inc.
5*a53d2e4fSAli Mashtizadeh  *
6*a53d2e4fSAli Mashtizadeh  * This software was developed by Ali Mashtizadeh under the sponsorship from
7*a53d2e4fSAli Mashtizadeh  * Netflix, Inc.
8*a53d2e4fSAli Mashtizadeh  *
9*a53d2e4fSAli Mashtizadeh  * Redistribution and use in source and binary forms, with or without
10*a53d2e4fSAli Mashtizadeh  * modification, are permitted provided that the following conditions
11*a53d2e4fSAli Mashtizadeh  * are met:
12*a53d2e4fSAli Mashtizadeh  * 1. Redistributions of source code must retain the above copyright
13*a53d2e4fSAli Mashtizadeh  *    notice, this list of conditions and the following disclaimer.
14*a53d2e4fSAli Mashtizadeh  * 2. Redistributions in binary form must reproduce the above copyright
15*a53d2e4fSAli Mashtizadeh  *    notice, this list of conditions and the following disclaimer in the
16*a53d2e4fSAli Mashtizadeh  *    documentation and/or other materials provided with the distribution.
17*a53d2e4fSAli Mashtizadeh  *
18*a53d2e4fSAli Mashtizadeh  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19*a53d2e4fSAli Mashtizadeh  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*a53d2e4fSAli Mashtizadeh  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*a53d2e4fSAli Mashtizadeh  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22*a53d2e4fSAli Mashtizadeh  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23*a53d2e4fSAli Mashtizadeh  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24*a53d2e4fSAli Mashtizadeh  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25*a53d2e4fSAli Mashtizadeh  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26*a53d2e4fSAli Mashtizadeh  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27*a53d2e4fSAli Mashtizadeh  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28*a53d2e4fSAli Mashtizadeh  * SUCH DAMAGE.
29*a53d2e4fSAli Mashtizadeh  *
30*a53d2e4fSAli Mashtizadeh  */
31*a53d2e4fSAli Mashtizadeh 
32*a53d2e4fSAli Mashtizadeh #define COLOR256_GREEN		46
33*a53d2e4fSAli Mashtizadeh #define COLOR256_RED		196
34*a53d2e4fSAli Mashtizadeh #define COLOR256_YELLOW		226
35*a53d2e4fSAli Mashtizadeh 
36*a53d2e4fSAli Mashtizadeh void setup_screen();
37*a53d2e4fSAli Mashtizadeh 
38*a53d2e4fSAli Mashtizadeh /* Formatting */
39*a53d2e4fSAli Mashtizadeh std::string format_siprefix(uint64_t count);
40*a53d2e4fSAli Mashtizadeh std::string format_binprefix(uint64_t count);
41*a53d2e4fSAli Mashtizadeh std::string format_sample(uint64_t count, uint64_t total);
42*a53d2e4fSAli Mashtizadeh std::string format_percent(uint64_t count, uint64_t total);
43*a53d2e4fSAli Mashtizadeh 
44*a53d2e4fSAli Mashtizadeh /* Printing */
45*a53d2e4fSAli Mashtizadeh enum class siunit {
46*a53d2e4fSAli Mashtizadeh 	seconds,
47*a53d2e4fSAli Mashtizadeh 	// Special
48*a53d2e4fSAli Mashtizadeh 	cycles,
49*a53d2e4fSAli Mashtizadeh 	percent
50*a53d2e4fSAli Mashtizadeh };
51*a53d2e4fSAli Mashtizadeh 
52*a53d2e4fSAli Mashtizadeh void title(const std::string &msg);
53*a53d2e4fSAli Mashtizadeh void header(const std::string &msg);
54*a53d2e4fSAli Mashtizadeh void printval(const std::string &msg, uint64_t val, siunit ui);
55*a53d2e4fSAli Mashtizadeh void printval(const std::string &msg, float val, siunit ui);
56*a53d2e4fSAli Mashtizadeh void printbar(float percent);
57*a53d2e4fSAli Mashtizadeh 
58*a53d2e4fSAli Mashtizadeh /* Tables */
59*a53d2e4fSAli Mashtizadeh class field
60*a53d2e4fSAli Mashtizadeh {
61*a53d2e4fSAli Mashtizadeh public:
field()62*a53d2e4fSAli Mashtizadeh 	field() { }
63*a53d2e4fSAli Mashtizadeh 	field(const std::string &s);
64*a53d2e4fSAli Mashtizadeh 	field(int64_t v);
65*a53d2e4fSAli Mashtizadeh 	field(float v);
66*a53d2e4fSAli Mashtizadeh 	field(int64_t count, int64_t total, bool percent = false);
67*a53d2e4fSAli Mashtizadeh 	field(int64_t user_count, int64_t user_total,
68*a53d2e4fSAli Mashtizadeh 	    int64_t kernel_count, int64_t kernel_total);
~field()69*a53d2e4fSAli Mashtizadeh 	virtual ~field() { }
70*a53d2e4fSAli Mashtizadeh 	virtual bool operator>(const field &b) const;
71*a53d2e4fSAli Mashtizadeh 	virtual bool operator<(const field &b) const;
72*a53d2e4fSAli Mashtizadeh 	virtual std::string to_string();
73*a53d2e4fSAli Mashtizadeh 	virtual size_t length();
74*a53d2e4fSAli Mashtizadeh private:
75*a53d2e4fSAli Mashtizadeh 	enum class FIELD {
76*a53d2e4fSAli Mashtizadeh 		STRING,
77*a53d2e4fSAli Mashtizadeh 		INTEGER,
78*a53d2e4fSAli Mashtizadeh 		FLOAT,
79*a53d2e4fSAli Mashtizadeh 		SAMPLE,
80*a53d2e4fSAli Mashtizadeh 		DSAMPLE,
81*a53d2e4fSAli Mashtizadeh 		PERCENT
82*a53d2e4fSAli Mashtizadeh 	};
83*a53d2e4fSAli Mashtizadeh 	FIELD type;
84*a53d2e4fSAli Mashtizadeh 	int64_t value[4];
85*a53d2e4fSAli Mashtizadeh 	float fvalue;
86*a53d2e4fSAli Mashtizadeh 	std::string svalue;
87*a53d2e4fSAli Mashtizadeh };
88*a53d2e4fSAli Mashtizadeh 
89*a53d2e4fSAli Mashtizadeh class table
90*a53d2e4fSAli Mashtizadeh {
91*a53d2e4fSAli Mashtizadeh public:
92*a53d2e4fSAli Mashtizadeh 	table();
93*a53d2e4fSAli Mashtizadeh 	~table();
94*a53d2e4fSAli Mashtizadeh 	void addcolumn(const std::string &c, bool alignleft = false);
95*a53d2e4fSAli Mashtizadeh 	void addrow(std::vector<field> r);
96*a53d2e4fSAli Mashtizadeh 	void sort(int col, bool descending = true);
97*a53d2e4fSAli Mashtizadeh 	void print();
98*a53d2e4fSAli Mashtizadeh private:
99*a53d2e4fSAli Mashtizadeh 	int sortcol;
100*a53d2e4fSAli Mashtizadeh 	bool sortdir;
101*a53d2e4fSAli Mashtizadeh 	std::vector<std::string> cols;
102*a53d2e4fSAli Mashtizadeh 	std::vector<bool> align;
103*a53d2e4fSAli Mashtizadeh 	std::vector<std::vector<field>> rows;
104*a53d2e4fSAli Mashtizadeh };
105*a53d2e4fSAli Mashtizadeh 
106