Index: utils/lib/python/soclib_desc/parameter.py
===================================================================
--- utils/lib/python/soclib_desc/parameter.py	(revision 841)
+++ utils/lib/python/soclib_desc/parameter.py	(working copy)
@@ -167,7 +169,23 @@
 		r = Base.instValue(self, env, param)
 		return r.ref()
 
-class Reference:
+class Unresolved:
+	def __mul__(self, other):
+		return Operation((lambda a,b: int(a) * int(b)),
+				[self, makeValue(other)])
+
+class Value(Unresolved):
+	def __init__(self, value):
+		self.value = value
+	def getValue(self, args):
+		return self.value
+
+def makeValue(a):
+	if isinstance(a, Unresolved):
+		return a
+	return Value(a)
+
+class Reference(Unresolved):
 	def __init__(self, name, mode = 'val'):
 		self.__name = name
 		self.__mode = mode
@@ -183,6 +201,22 @@
 		else:
 			raise ValueError("Unsupported mode %s for parameter.Reference"%self.__mode)
 
+class Template(Unresolved):
+	def __init__(self, name, args):
+		self.name = makeValue(name)
+		self.args = map(lambda x: makeValue(x), args)
+	def getValue(self, args):
+		params = ', '.join(map(lambda x:str(x.getValue(args)), self.args))
+		return self.name.getValue(args) + '<' + params + ' > '
+
+class Operation(Unresolved):
+	def __init__(self, func, args):
+		self.func = func
+		self.args = args
+		pass
+	def getValue(self, args):
+		return apply(self.func, map(lambda x:str(x.getValue(args)), self.args))
+
 class Constant:
 	def __init__(self, name):
 		self.__name = name
Index: utils/lib/python/soclib_desc/module.py
===================================================================
--- utils/lib/python/soclib_desc/module.py	(revision 841)
+++ utils/lib/python/soclib_desc/module.py	(working copy)
@@ -185,5 +190,5 @@
 		import parameter
 		for k in args.iterkeys():
 			v = args[k]
-			if isinstance(v, parameter.Reference):
+			if isinstance(v, parameter.Unresolved):
 				args[k] = v.getValue(args)
