func computeDevAddr(device types.BaseVirtualDevice, ctlr types.BaseVirtualController) (string, error) {
	vd := device.GetVirtualDevice()
	vc := ctlr.GetVirtualController()
	ctype, err := controllerTypeToClass(ctlr)
	if err != nil {
		return "", err
	}
	parts := []string{
		ctype,
		strconv.Itoa(int(vc.BusNumber)),
		strconv.Itoa(int(structure.DeRef(vd.UnitNumber).(int32))),
	}
	return strings.Join(parts, ":"), nil
}
func computeDevAddr(device types.BaseVirtualDevice, ctlr types.BaseVirtualController) (string, error) {
	vd := device.GetVirtualDevice()
	vc := ctlr.GetVirtualController()
	ctype, err := controllerTypeToClass(ctlr)
	if err != nil {
		return "", err
	}
	parts := []string{
		ctype,
		strconv.Itoa(int(vc.BusNumber)),
		strconv.Itoa(int(structure.DeRef(vd.UnitNumber).(int32))),
	}
	return strings.Join(parts, ":"), nil
}
// computeDevAddr handles the logic for SaveDevIDs and allows it to be used
// outside of a subresource.