<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def create( cls, node: Union[Node, str], name: str, *, model: str = None, serial: str = None, id_path: str = None, size: int = None, block_size: int = 512, tags: Iterable[str] = None):
 """ Create a physical block device on a Node. Either model and serial or id_path must be provided when creating a `BlockDevice`. Size (bytes) is always required. NOTE: It is recommended to use the MAAS commissioning process to discover `BlockDevice`'s on a machine. Getting any of this information incorrect can result on the machine failing to deploy. :param node: Node to create the block device on. :type node: `Node` or `str` :param name: The name for the block device. :type name: `str` :param model: The model number for the block device. :type model: `str` :param serial: The serial number for the block device. :type serial: `str` :param id_path: Unique path that identifies the device no matter the kernel the machine boots. Use only when the block device does not have a model and serial number. :type id_path: `str` :param size: The size of the block device in bytes. :type size: `int` :param block_size: The block size of the block device in bytes. :type block_size: `int` :param tags: List of tags to add to the block device. :type tags: sequence of `str` """

        params = {}
        if isinstance(node, str):
            params['system_id'] = node
        elif isinstance(node, Node):
            params['system_id'] = node.system_id
        else:
            raise TypeError(
                'node must be a Node or str, not %s' % (
                    type(node).__name__))

        if not size or size < 0:
            raise ValueError("size must be provided and greater than zero.")
        if not block_size or block_size < 0:
            raise ValueError(
                "block_size must be provided and greater than zero.")
        if model and not serial:
            raise ValueError("serial must be provided when model is provided.")
        if not model and serial:
            raise ValueError("model must be provided when serial is provided.")
        if not model and not serial and not id_path:
            raise ValueError(
                "Either model/serial is provided or id_path must be provided.")

        params.update(remove_None({
            'name': name,
            'model': model,
            'serial': serial,
            'id_path': id_path,
            'size': size,
            'block_size': block_size,
        }))
        device = cls._object(await cls._handler.create(**params))
        if tags:
            device.tags = tags
            await device.save()
        return device