From WikiChip
Difference between revisions of "Module:frequency table"

 
(29 intermediate revisions by 2 users not shown)
Line 34: Line 34:
 
function arg(name)
 
function arg(name)
 
return origArgs[name]
 
return origArgs[name]
 +
end
 +
 +
function to_raw_megahertz(txt)
 +
txt = string.gsub(string.lower(txt), ",", "")
 +
txt = string.gsub(txt, ' ', '')
 +
if string.find(txt, 'ghz') then
 +
txt = string.gsub(txt, 'ghz', '')
 +
return tonumber(txt) * 1000
 +
end
 +
if string.find(txt, 'mhz') then
 +
txt = string.gsub(txt, 'mhz', '')
 +
return tonumber(txt)
 +
end
 +
end
 +
 +
function p.get_color_from_normalized_speed(speed)
 +
speed = to_raw_megahertz(speed)
 +
local percent
 +
 +
if p.lowestF == p.highestF then
 +
percent = 1
 +
else
 +
percent = (speed - p.lowestF) / (p.highestF - p.lowestF)
 +
end
 +
 +
local color
 +
 +
if (p.lowestF / p.highestF) > 0.85 then --if less than 15% diff, we just go to orange
 +
color  = 60 * percent + 60
 +
else
 +
color  = 120 * percent -- green being 120, red is 0
 +
end
 +
 +
return 'hsl(' .. color .. ', 100%, 50%)'
 
end
 
end
  
Line 45: Line 79:
 
      
 
      
 
     local norm, avx2, avx512 = false, false, false
 
     local norm, avx2, avx512 = false, false, false
 +
    local normN, avx2N, avx512N, tmp = 0, 0, 0, 0
 +
    p.highestF, p.lowestF = 0, 999999
 
      
 
      
     local n = 0
+
     -- check how many cores we have
 +
    -- also check highest/lowest frequencies
 
     for i = 1, 50 do
 
     for i = 1, 50 do
     if has_arg('freq_' .. i) then n = i; norm = true end
+
     if has_arg('freq_' .. i) then
     if has_arg('freq_avx2_' .. i) then n = i; avx2 = true end
+
    normN = i; norm = true
     if has_arg('freq_avx512_' .. i) then n = i; avx512 = true end
+
    tmp = to_raw_megahertz(arg('freq_' .. i))
 +
    if tmp > p.highestF then p.highestF = tmp end
 +
    if tmp < p.lowestF then p.lowestF = tmp end
 +
end
 +
     if has_arg('freq_avx2_' .. i) then
 +
avx2N = i; avx2 = true
 +
    tmp = to_raw_megahertz(arg('freq_avx2_' .. i))
 +
    if tmp > p.highestF then p.highestF = tmp end
 +
    if tmp < p.lowestF then p.lowestF = tmp end
 +
end
 +
     if has_arg('freq_avx512_' .. i) then
 +
    avx512N = i; avx512 = true
 +
    tmp = to_raw_megahertz(arg('freq_avx512_' .. i))
 +
    if tmp > p.highestF then p.highestF = tmp end
 +
    if tmp < p.lowestF then p.lowestF = tmp end
 +
end
 
end
 
end
 +
 +
-- max cores of all
 +
local maxN = math.max(normN, avx2N, avx512N)
 
 
 
 
Line 58: Line 113:
 
     tbl
 
     tbl
 
         :attr('class', 'wikitable')
 
         :attr('class', 'wikitable')
         :attr('style', 'margin-left: 10px;')
+
         :attr('style', 'white-space: nowrap;')
 
          
 
          
 
     local tr = tbl:tag('tr')
 
     local tr = tbl:tag('tr')
    tr:tag('th'):attr('colspan', '2')
+
tr:tag('th'):attr('rowspan', '2'):wikitext('Mode')
     tr:tag('th'):attr('colspan', i):wikitext('Frequency/Active Cores')
+
tr:tag('th'):attr('rowspan', '2'):wikitext('Base')
 +
     tr:tag('th'):attr('colspan', maxN):attr('style', 'text-align: left;'):wikitext('Turbo Frequency/Active Cores')
 
    
 
    
 
tr = tbl:tag('tr')
 
tr = tbl:tag('tr')
tr:tag('th'):wikitext('Mode')
+
for i = 1, maxN do
tr:tag('th'):wikitext('Base')
 
for i = 1, n do
 
 
tr:tag('th'):wikitext(i)
 
tr:tag('th'):wikitext(i)
 
end
 
end
 
 
if norm then
+
if norm or has_arg('freq_base') then
 
tr = tbl:tag('tr')
 
tr = tbl:tag('tr')
 
tr:tag('th'):wikitext('Normal')
 
tr:tag('th'):wikitext('Normal')
for i = 1, n do
+
tr:tag('th'):wikitext(arg('freq_base'))
 +
for i = 1, normN do
 
if has_arg('freq_' .. i) then
 
if has_arg('freq_' .. i) then
tr:tag('td'):wikitext(arg('freq_' .. i))
+
tr:tag('td'):attr('style', 'background-color:' .. p.get_color_from_normalized_speed(arg('freq_' .. i))):wikitext(arg('freq_' .. i))
 
else
 
else
 
tr:tag('td'):wikitext('&nbsp;')
 
tr:tag('td'):wikitext('&nbsp;')
Line 83: Line 138:
 
end
 
end
 
 
if avx2 then
+
if avx2 or has_arg('freq_avx2_base') then
 
tr = tbl:tag('tr')
 
tr = tbl:tag('tr')
 
tr:tag('th'):wikitext('AVX2')
 
tr:tag('th'):wikitext('AVX2')
for i = 1, n do
+
tr:tag('th'):wikitext(arg('freq_avx2_base'))
 +
for i = 1, avx2N do
 
if has_arg('freq_avx2_' .. i) then
 
if has_arg('freq_avx2_' .. i) then
tr:tag('td'):wikitext(arg('freq_avx2_' .. i))
+
tr:tag('td'):attr('style', 'background-color:' .. p.get_color_from_normalized_speed(arg('freq_avx2_' .. i))):wikitext(arg('freq_avx2_' .. i))
 
else
 
else
 
tr:tag('td'):wikitext('&nbsp;')
 
tr:tag('td'):wikitext('&nbsp;')
Line 95: Line 151:
 
end
 
end
 
 
if avx512 then
+
if avx512 or has_arg('freq_avx512_base') then
 
tr = tbl:tag('tr')
 
tr = tbl:tag('tr')
 
tr:tag('th'):wikitext('AVX512')
 
tr:tag('th'):wikitext('AVX512')
for i = 1, n do
+
tr:tag('th'):wikitext(arg('freq_avx512_base'))
 +
for i = 1, avx512N do
 
if has_arg('freq_avx512_' .. i) then
 
if has_arg('freq_avx512_' .. i) then
tr:tag('td'):wikitext(arg('freq_avx512_' .. i))
+
tr:tag('td'):attr('style', 'background-color:' .. p.get_color_from_normalized_speed(arg('freq_avx512_' .. i))):wikitext(arg('freq_avx512_' .. i))
 
else
 
else
 
tr:tag('td'):wikitext('&nbsp;')
 
tr:tag('td'):wikitext('&nbsp;')

Latest revision as of 11:53, 27 July 2017

To add this template, simple add
{{frequency table}}
to the page and save. The chip infobox will have a small [Modify Frequency Info] button at the top-right corner which can be used to add values using a form.
local p = {}
local origArgs

function p.add_file_prefix(str)
  if string.match(string.lower(str), '^file:') then
    return str
  else
    return 'File:' .. str
  end
end

function p.add_separator(box, title)
  box:tag('tr')
           :tag('td')
           :attr('class', 'header')
           :attr('colspan', '2')
           :wikitext(title)
end

function p.add_entry(value, right)
  local e = mw.html.create('tr')
  e:tag('td')
    :attr('class', 'label')
    :wikitext(value)
  e:node(right)
  return e   
end

function has_arg(name)
	-- The argument can exist and be empty or not exist at all
	return string.len(origArgs[name] or '') > 0
end

function arg(name)
	return origArgs[name]
end

function to_raw_megahertz(txt)
	txt = string.gsub(string.lower(txt), ",", "")
	txt = string.gsub(txt, ' ', '')
	if string.find(txt, 'ghz') then
		txt = string.gsub(txt, 'ghz', '')
		return tonumber(txt) * 1000
	end
	if string.find(txt, 'mhz') then
		txt = string.gsub(txt, 'mhz', '')
		return tonumber(txt)
	end
end

function p.get_color_from_normalized_speed(speed)
	speed = to_raw_megahertz(speed)
	local percent
	
	if p.lowestF == p.highestF then
		percent = 1
	else
		percent = (speed - p.lowestF) / (p.highestF - p.lowestF)
	end
	
	local color
	
	if (p.lowestF / p.highestF) > 0.85 then --if less than 15% diff, we just go to orange
		color  = 60 * percent + 60
	else
		color  = 120 * percent -- green being 120, red is 0
	end
	
	return 'hsl(' .. color .. ', 100%, 50%)'
end

function p.frequency_table(frame)
	
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
    else
        origArgs = frame.args
    end
    
    local norm, avx2, avx512 = false, false, false
    local normN, avx2N, avx512N, tmp = 0, 0, 0, 0
    p.highestF, p.lowestF = 0, 999999
    
    -- check how many cores we have
    -- also check highest/lowest frequencies
    for i = 1, 50 do
    	if	has_arg('freq_' .. i) then
    		normN = i; norm = true
    		tmp = to_raw_megahertz(arg('freq_' .. i))
    		if tmp > p.highestF then p.highestF = tmp end
    		if tmp < p.lowestF then p.lowestF = tmp end
		end
    	if	has_arg('freq_avx2_' .. i) then
			avx2N = i; avx2 = true
    		tmp = to_raw_megahertz(arg('freq_avx2_' .. i))
    		if tmp > p.highestF then p.highestF = tmp end
    		if tmp < p.lowestF then p.lowestF = tmp end
		end
    	if	has_arg('freq_avx512_' .. i) then
    		avx512N = i; avx512 = true
    		tmp = to_raw_megahertz(arg('freq_avx512_' .. i))
    		if tmp > p.highestF then p.highestF = tmp end
    		if tmp < p.lowestF then p.lowestF = tmp end
		end
	end

	-- max cores of all
	local maxN = math.max(normN, avx2N, avx512N)
	
	
    local tbl = mw.html.create('table')

    tbl
        :attr('class', 'wikitable')
        :attr('style', 'white-space: nowrap;')
        
    local tr = tbl:tag('tr')
		tr:tag('th'):attr('rowspan', '2'):wikitext('Mode')
		tr:tag('th'):attr('rowspan', '2'):wikitext('Base')
    	tr:tag('th'):attr('colspan', maxN):attr('style', 'text-align: left;'):wikitext('Turbo Frequency/Active Cores')
    	
	tr = tbl:tag('tr')
		for i = 1, maxN do
			tr:tag('th'):wikitext(i)	
		end
	
	if norm or has_arg('freq_base') then
		tr = tbl:tag('tr')
		tr:tag('th'):wikitext('Normal')
		tr:tag('th'):wikitext(arg('freq_base'))
		for i = 1, normN do
			if has_arg('freq_' .. i) then
				tr:tag('td'):attr('style', 'background-color:' .. p.get_color_from_normalized_speed(arg('freq_' .. i))):wikitext(arg('freq_' .. i))
			else
				tr:tag('td'):wikitext('&nbsp;')
			end
		end
	end
	
	if avx2 or has_arg('freq_avx2_base') then
		tr = tbl:tag('tr')
		tr:tag('th'):wikitext('AVX2')
		tr:tag('th'):wikitext(arg('freq_avx2_base'))
		for i = 1, avx2N do
			if has_arg('freq_avx2_' .. i) then
				tr:tag('td'):attr('style', 'background-color:' .. p.get_color_from_normalized_speed(arg('freq_avx2_' .. i))):wikitext(arg('freq_avx2_' .. i))
			else
				tr:tag('td'):wikitext('&nbsp;')
			end
		end
	end
	
	if avx512 or has_arg('freq_avx512_base') then
		tr = tbl:tag('tr')
		tr:tag('th'):wikitext('AVX512')
		tr:tag('th'):wikitext(arg('freq_avx512_base'))
		for i = 1, avx512N do
			if has_arg('freq_avx512_' .. i) then
				tr:tag('td'):attr('style', 'background-color:' .. p.get_color_from_normalized_speed(arg('freq_avx512_' .. i))):wikitext(arg('freq_avx512_' .. i))
			else
				tr:tag('td'):wikitext('&nbsp;')
			end
		end
	end
	
    return tbl
end

return p