<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def nodes(verbose=False):
    '''
    List all compute nodes

    verbose : boolean
        print additional information about the node
        e.g. platform version, hvm capable, ...

    CLI Example:

    .. code-block:: bash

        salt-run vmadm.nodes
        salt-run vmadm.nodes verbose=True
    '''
    ret = {} if verbose else []
    client = salt.client.get_local_client(__opts__['conf_file'])

    ## get list of nodes
    try:
        for cn in client.cmd_iter('G@virtual:physical and G@os:smartos',
                                  'grains.items', tgt_type='compound'):
            if not cn:
                continue
            node = next(six.iterkeys(cn))
            if not isinstance(cn[node], dict) or \
                    'ret' not in cn[node] or \
                    not isinstance(cn[node]['ret'], dict):
                continue
            if verbose:
                ret[node] = {}
                ret[node]['version'] = {}
                ret[node]['version']['platform'] = cn[node]['ret']['osrelease']
                if 'computenode_sdc_version' in cn[node]['ret']:
                    ret[node]['version']['sdc'] = cn[node]['ret']['computenode_sdc_version']
                ret[node]['vms'] = {}
                if 'computenode_vm_capable' in cn[node]['ret'] and \
                        cn[node]['ret']['computenode_vm_capable'] and \
                        'computenode_vm_hw_virt' in cn[node]['ret']:
                    ret[node]['vms']['hw_cap'] = cn[node]['ret']['computenode_vm_hw_virt']
                else:
                    ret[node]['vms']['hw_cap'] = False
                if 'computenode_vms_running' in cn[node]['ret']:
                    ret[node]['vms']['running'] = cn[node]['ret']['computenode_vms_running']
            else:
                ret.append(node)
    except SaltClientError as client_error:
        return "{0}".format(client_error)

    if not verbose:
        ret.sort()
    return ret