# Copyright (c) 2001, Stanford University # All rights reserved. # # See the file LICENSE.txt for information on redistributing this software from __future__ import print_function import sys def main(): name = sys.argv[1] Name = sys.argv[2] print("""/* This code is AUTOGENERATED!!! */ #include "state.h" #include "state_internals.h\"""") print(""" void crState%(Name)sDiff(CR%(Name)sBits *b, CRbitvalue *bitID, CRContext *fromCtx, CRContext *toCtx) { CR%(Name)sState *from = &(fromCtx->%(name)s); CR%(Name)sState *to = &(toCtx->%(name)s);"""%vars()) gendiffcode("state_%s.txt"%(name.lower()), name, docopy=1, doinvalid=0) print("""} void crState%(Name)sSwitch(CR%(Name)sBits *b, CRbitvalue *bitID, CRContext *fromCtx, CRContext *toCtx) { CR%(Name)sState *from = &(fromCtx->%(name)s); CR%(Name)sState *to = &(toCtx->%(name)s);"""%vars()) gendiffcode("state_%s.txt"%(Name.lower()), Name, docopy=0, doinvalid=1) print("}\n") def gendiffcode(fname, state_name, docopy, doinvalid): target = "to" current = "from" bit = "b" extrabit = "" tab = "\t" current_guard = "" current_dependency = "" v_types = { 'l': 'GLboolean', 'b': 'GLbyte', 'ub': 'GLubyte', 's': 'GLshort', 'us': 'GLushort', 'i': 'GLint', 'ui': 'GLuint', 'f': 'GLfloat', 'd': 'GLdouble' } FILE = open(sys.argv[3]+"/"+fname, "r") print(""" unsigned int j, i; CRbitvalue nbitID[CR_MAX_BITARRAY]; for (j = 0; j(.*)", line) if m: text = m.group(1) if re.search("}", line): tab = tab[:-1] print(tab+text) if re.search("{", line): tab = tab+"\t" continue ## Handle commands m = re.search("%target=(\w*)", line) if m: target = m.group(1) m = re.search("%current=(\w*)", line) if m: current = m.group(1) m = re.search("%bit=(\w*)", line) if m: bit = m.group(1) m = re.search("%extrabit=(\w*)", line) if m: extrabit = m.group(1) if re.search("%flush", line): if current_guard != "": print(tab+"CLEARDIRTY(%(bit)s->%(current_guard)s, nbitID);"%vars()) tab = tab[:-1] print(tab+"}") if docopy and current_dependency != "": tab = tab[:-1] print(tab+"}") current_guard = "" current_dependency = "" if re.search("%", line): continue ## Load the line (dependency, guardbit, members, func) = \ (re.split(":", line) + ["", ""])[0:4] func = func.rstrip() ## Close the guardbit and dependency if current_guard != "" and current_guard != guardbit: print(tab+"CLEARDIRTY(%(bit)s->%(current_guard)s, nbitID);"%vars()) tab = tab[:-1] print(tab+"}") if docopy and current_dependency != "" and current_dependency != dependency: tab = tab[:-1] print(tab+"}") ## Open the dependency if if docopy and current_dependency != dependency and dependency != "": print(tab+"if (%(target)s->%(dependency)s)\n%(tab)s{"%vars()) tab = tab+"\t" current_dependency = dependency ## Open the guard if if docopy and current_dependency != dependency and dependency != "": print(tab+"if ($(target)s->%(dependency)s)\n%(tab)s{"%vars()) tab = tab+"\t" if current_guard != guardbit and guardbit != "": print(tab+"if (CHECKDIRTY(%(bit)s->%(guardbit)s, bitID))\n%(tab)s{"%vars()) tab = tab+"\t" if members[0] != "*" and guardbit[0:6] == "enable": print(tab+"glAble able[2];") print(tab+"able[0] = diff_api.Disable;") print(tab+"able[1] = diff_api.Enable;") current_dependency = dependency current_guard = guardbit ## Handle text dump if members[0] == "*": print(tab+members[1:]) else: ## Parse the members variable mainelem = re.split(",", members) elems = re.split("\|", members) if len(elems) > 1: mainelem = [""] mainelem[0] = elems[0] elems = re.split(",", elems[1]) newelems = [] for elem in elems: elem = mainelem[0] + "." + elem newelems += [elem] elems = newelems else: elems = re.split(",", members) ## Check member values if guardbit != "extensions": sys.stdout.write(tab+"if (") first = 1 for elem in elems: if first != 1: print(" ||\n"+tab+" ", end="") first = 0 sys.stdout.write("%(current)s->%(elem)s != %(target)s->%(elem)s"%vars()) print(")\n"+tab+"{") tab = tab+"\t" ## Handle text function if func[0] == "*": func = func[1:] print(tab+func) else: if func != "": ## Call the glhw function if guardbit[0:6] == "enable": print(tab+"able["+target+"->"+elems[0]+"]("+func+");") elif guardbit == "extensions": print(tab+"crState$state_name",end="") if docopy == 1: print("Diff",end="") else: print("Switch",end="") print("Extensions(from, to);") else: funcargs = re.split(",", func) #print "// funcargs:",funcargs func = funcargs.pop(0) if func[-1] == "v": v_type = func[-2:-1] num_elems = len(elems) print(tab+v_types[v_type]+" varg["+str(num_elems)+"];") i = 0 for elem in elems: print(tab+"varg["+str(i)+"] = "+target+"->"+elem+";") i += 1 elif func[-3:] == "vNV": v_type = func[-4:-3] num_elems = len(elems) print(tab+v_types[v_type]+" varg["+str(num_elems)+"];") i = 0 for elem in elems: print(tab+"varg["+str(i)+"] = "+target+"->"+elem+";") i += 1 sys.stdout.write(tab+"diff_api.%(func)s("%vars()) for funcarg in funcargs: sys.stdout.write(funcarg+", ") ## Handle vargs if func[-1] == "v" or func[-3:] == "vNV": sys.stdout.write("varg") else: first = 1 for elem in elems: if first != 1: sys.stdout.write(",\n"+tab+" ") first = 0 sys.stdout.write(target+"->"+elem) print(");") ## Do the sync if necessary if docopy and guardbit != "extensions": for elem in mainelem: print(tab+current+"->"+elem+" = "+target+"->"+elem+";") ## Do the clear if necessary if doinvalid: if guardbit != "": print(tab+"FILLDIRTY(%(bit)s->%(guardbit)s);"%vars()) print(tab+"FILLDIRTY(%(bit)s->dirty);"%vars()) if extrabit != "": print(tab+"FILLDIRTY(%(extrabit)s->dirty);"%vars()) ## Close the compare if guardbit != "extensions": tab = tab[:-1] print(tab+"}") ## Do final closures if current_guard != "": print(tab+"CLEARDIRTY(%(bit)s->%(current_guard)s, nbitID);"%vars()) tab = tab[:-1] print(tab+"}") if docopy and current_dependency != "": tab = tab[:-1] print(tab+"} /*%(current_dependency)s*/"%vars()) print(tab+"CLEARDIRTY(%(bit)s->dirty, nbitID);"%vars()) main()