<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def fill(cdb, defs, pparms):
 """ Take field values in parms and insert them into cdb based on the field definitions in defs. """

        #print "defs =", defs
        parms = {n:v[2] for (n,v) in defs.items()}  # Create parms for default field values.
        parms.update(pparms)  # Insert real parameters.
        for (name, value) in parms.items():
            if name not in defs:
                raise Exception("unknown field: "+name)
            width = defs[name][1]
            start = defs[name][0]
            if type(start) == type(0):  # must be either number or list of 2
                start = (start,7)
            # TODO Check type of start.

            if type(value) == type("str"):
                if len(value) > width/8:
                    raise Exception("value too large for field: "+name)
                if start[1] != 7:
                    raise Exception("string must start in bit 7: "+name)
                value += " " * (width/8 - len(value))  # Fill with blanks.
                cdb[start[0]:start[0]+len(value)] = value
            else:
                if value >= 1<<width:
                    raise Exception("value too large for field: "+name)
                startbitnum = start[0]*8 + (7-start[1])  # Number bits l-to-r.
                bitnum = startbitnum + defs[name][1] - 1
                # TODO Is value inserted backwards?
                while width > 0:
                    if bitnum % 8 == 7 and width >= 8:
                        bitlen= 8
                        cdb[bitnum//8] = value & 0xff;
                    else:
                        startofbyte = bitnum // 8 * 8  # Find first bit num in byte.
                        firstbit = max(startofbyte, bitnum-width+1)
                        bitlen= bitnum-firstbit+1
                        shift = (7 - bitnum%8)
                        vmask = (1 << bitlen) - 1
                        bmask = ~(vmask << shift)
                        cdb[bitnum//8] &= bmask
                        cdb[bitnum//8] |= (value & vmask) << shift
                    bitnum -= bitlen
                    value >>= bitlen
                    width  -= bitlen