def update(self, E=None, **F):
        '''
        D.update([E, ]**F) -> None
        Update the bitfield from dict/iterable E and F.
        If E present and has a .keys() method, does:   for k in E: D.k = E[k]
        If E present and lacks .keys() method, does:   for (k, v) in E: D.k = v
        In either case, this is followed by:           for k in F: D.k = F[k]
        
        The entire update is applied in a single read and a single write, 
        in case the target is a memory-mapped register.  The read and write
        are independent, rather than an atomic RMW cycle.
        
        '''
        
        temp = self.clone()
        if E:
            try:
                for k in E.keys():
                    setattr(temp, k, E[k])
            except (AttributeError, ValueError):
                for k, v in E:
                    setattr(temp, k, v)
                    
        for k, v in F.items():
            setattr(temp, k, v)
            
        self.base = temp.base